blob: 010f98d21801015142f6afcb6ae228bc1564bb8e [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>
Alexander Couzens290d9032020-09-16 21:52:02 +020016#include <osmocom/gprs/gprs_ns2.h>
Andreas Eversberg12942562012-07-12 14:31:57 +020017#include "pcu_vty.h"
Andreas Eversberg8b761a32012-07-20 21:50:31 +020018#include "gprs_rlcmac.h"
Max6dc90b82018-02-19 17:17:28 +010019#include <pdch.h>
Holger Hans Peter Freyther67ed34e2013-10-17 17:01:54 +020020#include "bts.h"
Jacob Erlbeckc0c580c2015-04-30 15:59:01 +020021#include "tbf.h"
Jacob Erlbeck62e96a32015-06-04 09:42:14 +020022#include "pcu_vty_functions.h"
23
Harald Welte717cdf52017-07-21 21:56:23 +020024extern void *tall_pcu_ctx;
25
26static const struct value_string pcu_gsmtap_categ_names[] = {
27 { PCU_GSMTAP_C_DL_UNKNOWN, "dl-unknown" },
28 { PCU_GSMTAP_C_DL_DUMMY, "dl-dummy" },
29 { PCU_GSMTAP_C_DL_CTRL, "dl-ctrl" },
30 { PCU_GSMTAP_C_DL_DATA_GPRS, "dl-data-gprs" },
31 { PCU_GSMTAP_C_DL_DATA_EGPRS, "dl-data-egprs" },
Harald Weltebc219d52017-07-29 13:42:27 +020032 { PCU_GSMTAP_C_DL_PTCCH, "dl-ptcch" },
Pau Espin Pedrol58543702019-09-30 19:07:16 +020033 { PCU_GSMTAP_C_DL_AGCH, "dl-agch" },
34 { PCU_GSMTAP_C_DL_PCH, "dl-pch" },
Harald Welte717cdf52017-07-21 21:56:23 +020035
36 { PCU_GSMTAP_C_UL_UNKNOWN, "ul-unknown" },
37 { PCU_GSMTAP_C_UL_DUMMY, "ul-dummy" },
38 { PCU_GSMTAP_C_UL_CTRL, "ul-ctrl" },
39 { PCU_GSMTAP_C_UL_DATA_GPRS, "ul-data-gprs" },
40 { PCU_GSMTAP_C_UL_DATA_EGPRS, "ul-data-egprs" },
Pau Espin Pedrol1ec211f2019-09-30 18:33:14 +020041 { PCU_GSMTAP_C_UL_RACH, "ul-rach" },
Vadim Yanitskiy07b64872020-06-11 00:26:15 +070042 { PCU_GSMTAP_C_UL_PTCCH, "ul-ptcch" },
Harald Welte717cdf52017-07-21 21:56:23 +020043
44 { 0, NULL }
45};
46
47static const struct value_string pcu_gsmtap_categ_help[] = {
48 { PCU_GSMTAP_C_DL_UNKNOWN, "Unknown / Unparseable / Erroneous Downlink Blocks" },
49 { PCU_GSMTAP_C_DL_DUMMY, "Downlink Dummy Blocks" },
50 { PCU_GSMTAP_C_DL_CTRL, "Downlink Control Blocks" },
51 { PCU_GSMTAP_C_DL_DATA_GPRS, "Downlink Data Blocks (GPRS)" },
52 { PCU_GSMTAP_C_DL_DATA_EGPRS, "Downlink Data Blocks (EGPRS)" },
Harald Weltebc219d52017-07-29 13:42:27 +020053 { PCU_GSMTAP_C_DL_PTCCH, "Downlink PTCCH Blocks" },
Pau Espin Pedrol58543702019-09-30 19:07:16 +020054 { PCU_GSMTAP_C_DL_AGCH, "Downlink AGCH Blocks" },
55 { PCU_GSMTAP_C_DL_PCH, "Downlink PCH Blocks" },
Harald Welte717cdf52017-07-21 21:56:23 +020056
57 { PCU_GSMTAP_C_UL_UNKNOWN, "Unknown / Unparseable / Erroneous Downlink Blocks" },
58 { PCU_GSMTAP_C_UL_DUMMY, "Uplink Dummy Blocks" },
59 { PCU_GSMTAP_C_UL_CTRL, "Uplink Control Blocks" },
60 { PCU_GSMTAP_C_UL_DATA_GPRS, "Uplink Data Blocks (GPRS)" },
61 { PCU_GSMTAP_C_UL_DATA_EGPRS, "Uplink Data Blocks (EGPRS)" },
Pau Espin Pedrol1ec211f2019-09-30 18:33:14 +020062 { PCU_GSMTAP_C_UL_RACH, "Uplink RACH Bursts" },
Vadim Yanitskiy07b64872020-06-11 00:26:15 +070063 { PCU_GSMTAP_C_UL_PTCCH, "Uplink PTCCH Bursts" },
Harald Welte717cdf52017-07-21 21:56:23 +020064
65 { 0, NULL }
66};
67
68
69DEFUN(cfg_pcu_gsmtap_categ, cfg_pcu_gsmtap_categ_cmd, "HIDDEN", "HIDDEN")
70{
71 struct gprs_rlcmac_bts *bts = bts_main_data();
72 int categ;
73
74 categ = get_string_value(pcu_gsmtap_categ_names, argv[0]);
75 if (categ < 0)
76 return CMD_WARNING;
77
78 bts->gsmtap_categ_mask |= (1 << categ);
79
80 return CMD_SUCCESS;
81}
82
83DEFUN(cfg_pcu_no_gsmtap_categ, cfg_pcu_no_gsmtap_categ_cmd, "HIDDEN", "HIDDEN")
84{
85 struct gprs_rlcmac_bts *bts = bts_main_data();
86 int categ;
87
88 categ = get_string_value(pcu_gsmtap_categ_names, argv[0]);
89 if (categ < 0)
90 return CMD_WARNING;
91
92 bts->gsmtap_categ_mask &= ~(1 << categ);
93
94 return CMD_SUCCESS;
95}
96
Andreas Eversberg8b761a32012-07-20 21:50:31 +020097static struct cmd_node pcu_node = {
98 (enum node_type) PCU_NODE,
Jacob Erlbeckcc12f022015-04-09 15:45:24 +020099 "%s(config-pcu)# ",
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200100 1,
101};
102
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200103static int config_write_pcu(struct vty *vty)
104{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200105 struct gprs_rlcmac_bts *bts = bts_main_data();
Harald Welte717cdf52017-07-21 21:56:23 +0200106 unsigned int i;
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200107
108 vty_out(vty, "pcu%s", VTY_NEWLINE);
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200109 if (bts->egprs_enabled)
Jacob Erlbeck9b3d7e02016-01-19 10:44:42 +0100110 vty_out(vty, " egprs only%s", VTY_NEWLINE);
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200111
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200112 vty_out(vty, " flow-control-interval %d%s", bts->fc_interval,
113 VTY_NEWLINE);
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200114 if (bts->fc_bvc_bucket_size)
115 vty_out(vty, " flow-control force-bvc-bucket-size %d%s",
116 bts->fc_bvc_bucket_size, VTY_NEWLINE);
117 if (bts->fc_bvc_leak_rate)
118 vty_out(vty, " flow-control force-bvc-leak-rate %d%s",
119 bts->fc_bvc_leak_rate, VTY_NEWLINE);
120 if (bts->fc_ms_bucket_size)
121 vty_out(vty, " flow-control force-ms-bucket-size %d%s",
122 bts->fc_ms_bucket_size, VTY_NEWLINE);
123 if (bts->fc_ms_leak_rate)
124 vty_out(vty, " flow-control force-ms-leak-rate %d%s",
125 bts->fc_ms_leak_rate, VTY_NEWLINE);
Holger Hans Peter Freytherc421e8a2014-07-02 14:55:17 +0200126 if (bts->force_cs) {
Andreas Eversberg499ff412012-10-03 14:21:36 +0200127 if (bts->initial_cs_ul == bts->initial_cs_dl)
128 vty_out(vty, " cs %d%s", bts->initial_cs_dl,
129 VTY_NEWLINE);
130 else
131 vty_out(vty, " cs %d %d%s", bts->initial_cs_dl,
132 bts->initial_cs_ul, VTY_NEWLINE);
Holger Hans Peter Freytherc421e8a2014-07-02 14:55:17 +0200133 }
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200134 if (bts->max_cs_dl && bts->max_cs_ul) {
135 if (bts->max_cs_ul == bts->max_cs_dl)
136 vty_out(vty, " cs max %d%s", bts->max_cs_dl,
137 VTY_NEWLINE);
138 else
139 vty_out(vty, " cs max %d %d%s", bts->max_cs_dl,
140 bts->max_cs_ul, VTY_NEWLINE);
141 }
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200142 if (bts->cs_adj_enabled)
143 vty_out(vty, " cs threshold %d %d%s",
144 bts->cs_adj_lower_limit, bts->cs_adj_upper_limit,
145 VTY_NEWLINE);
146 else
147 vty_out(vty, " no cs threshold%s", VTY_NEWLINE);
148
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +0200149 if (bts->cs_downgrade_threshold)
150 vty_out(vty, " cs downgrade-threshold %d%s",
151 bts->cs_downgrade_threshold, VTY_NEWLINE);
152 else
153 vty_out(vty, " no cs downgrade-threshold%s", VTY_NEWLINE);
154
Jacob Erlbeck94cde132015-06-09 09:44:36 +0200155 vty_out(vty, " cs link-quality-ranges cs1 %d cs2 %d %d cs3 %d %d cs4 %d%s",
156 bts->cs_lqual_ranges[0].high,
157 bts->cs_lqual_ranges[1].low,
158 bts->cs_lqual_ranges[1].high,
159 bts->cs_lqual_ranges[2].low,
160 bts->cs_lqual_ranges[2].high,
161 bts->cs_lqual_ranges[3].low,
162 VTY_NEWLINE);
163
Minh-Quang Nguyen1f189092017-08-16 09:50:06 -0400164 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",
165 bts->mcs_lqual_ranges[0].high,
166 bts->mcs_lqual_ranges[1].low,
167 bts->mcs_lqual_ranges[1].high,
168 bts->mcs_lqual_ranges[2].low,
169 bts->mcs_lqual_ranges[2].high,
170 bts->mcs_lqual_ranges[3].low,
171 bts->mcs_lqual_ranges[3].high,
172 bts->mcs_lqual_ranges[4].low,
173 bts->mcs_lqual_ranges[4].high,
174 bts->mcs_lqual_ranges[5].low,
175 bts->mcs_lqual_ranges[5].high,
176 bts->mcs_lqual_ranges[6].low,
177 bts->mcs_lqual_ranges[6].high,
178 bts->mcs_lqual_ranges[7].low,
179 bts->mcs_lqual_ranges[7].high,
180 bts->mcs_lqual_ranges[8].low,
181 VTY_NEWLINE);
182
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +0100183 if (bts->initial_mcs_dl != 1 && bts->initial_mcs_ul != 1) {
184 if (bts->initial_mcs_ul == bts->initial_mcs_dl)
185 vty_out(vty, " mcs %d%s", bts->initial_mcs_dl,
186 VTY_NEWLINE);
187 else
188 vty_out(vty, " mcs %d %d%s", bts->initial_mcs_dl,
189 bts->initial_mcs_ul, VTY_NEWLINE);
190 }
Minh-Quang Nguyen1f189092017-08-16 09:50:06 -0400191
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100192 if (bts->max_mcs_dl && bts->max_mcs_ul) {
193 if (bts->max_mcs_ul == bts->max_mcs_dl)
194 vty_out(vty, " mcs max %d%s", bts->max_mcs_dl,
195 VTY_NEWLINE);
196 else
197 vty_out(vty, " mcs max %d %d%s", bts->max_mcs_dl,
198 bts->max_mcs_ul, VTY_NEWLINE);
199 }
200
Jacob Erlbeck36df7742016-01-19 15:53:30 +0100201 vty_out(vty, " window-size %d %d%s", bts->ws_base, bts->ws_pdch,
202 VTY_NEWLINE);
203
Aravind Sirsikar50b09702016-08-22 17:21:10 +0530204 if (bts->dl_arq_type)
205 vty_out(vty, " egprs dl arq-type arq2%s",
206 VTY_NEWLINE);
207
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200208 if (bts->force_llc_lifetime == 0xffff)
209 vty_out(vty, " queue lifetime infinite%s", VTY_NEWLINE);
210 else if (bts->force_llc_lifetime)
211 vty_out(vty, " queue lifetime %d%s", bts->force_llc_lifetime,
212 VTY_NEWLINE);
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100213 if (bts->llc_discard_csec)
214 vty_out(vty, " queue hysteresis %d%s", bts->llc_discard_csec,
215 VTY_NEWLINE);
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200216 if (bts->llc_idle_ack_csec)
217 vty_out(vty, " queue idle-ack-delay %d%s", bts->llc_idle_ack_csec,
218 VTY_NEWLINE);
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200219 if (bts->llc_codel_interval_msec == LLC_CODEL_USE_DEFAULT)
220 vty_out(vty, " queue codel%s", VTY_NEWLINE);
221 else if (bts->llc_codel_interval_msec == LLC_CODEL_DISABLE)
222 vty_out(vty, " no queue codel%s", VTY_NEWLINE);
223 else
224 vty_out(vty, " queue codel interval %d%s",
225 bts->llc_codel_interval_msec/10, VTY_NEWLINE);
226
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200227 if (bts->alloc_algorithm == alloc_algorithm_a)
228 vty_out(vty, " alloc-algorithm a%s", VTY_NEWLINE);
229 if (bts->alloc_algorithm == alloc_algorithm_b)
230 vty_out(vty, " alloc-algorithm b%s", VTY_NEWLINE);
Jacob Erlbeck400ec022015-07-14 13:31:48 +0200231 if (bts->alloc_algorithm == alloc_algorithm_dynamic)
232 vty_out(vty, " alloc-algorithm dynamic%s", VTY_NEWLINE);
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200233 if (bts->force_two_phase)
234 vty_out(vty, " two-phase-access%s", VTY_NEWLINE);
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200235 vty_out(vty, " alpha %d%s", bts->alpha, VTY_NEWLINE);
236 vty_out(vty, " gamma %d%s", bts->gamma * 2, VTY_NEWLINE);
Oliver Smith45fdc442019-09-05 15:12:20 +0200237 if (!bts->dl_tbf_preemptive_retransmission)
238 vty_out(vty, " no dl-tbf-preemptive-retransmission%s", VTY_NEWLINE);
Pau Espin Pedrolc4178e52017-08-08 15:03:50 +0200239 if (strcmp(bts->pcu_sock_path, PCU_SOCK_DEFAULT))
240 vty_out(vty, " pcu-socket %s%s", bts->pcu_sock_path, VTY_NEWLINE);
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200241
Harald Welte717cdf52017-07-21 21:56:23 +0200242 for (i = 0; i < 32; i++) {
243 unsigned int cs = (1 << i);
244 if (bts->gsmtap_categ_mask & cs) {
245 vty_out(vty, " gsmtap-category %s%s",
246 get_value_string(pcu_gsmtap_categ_names, i), VTY_NEWLINE);
247 }
248 }
249
Harald Welte57d35152018-07-05 03:11:17 +0200250 if (bts->gb_dialect_sns)
251 vty_out(vty, " gb-dialect ip-sns%s", VTY_NEWLINE);
252 else
253 vty_out(vty, " gb-dialect classic%s", VTY_NEWLINE);
254
Pau Espin Pedrol18794422019-09-26 18:25:35 +0200255 osmo_tdef_vty_write(vty, bts->T_defs_pcu, " timer ");
256
Maxc9ce6f92018-01-30 17:53:02 +0100257 return CMD_SUCCESS;
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200258}
259
260/* per-BTS configuration */
261DEFUN(cfg_pcu,
262 cfg_pcu_cmd,
263 "pcu",
264 "BTS specific configure")
265{
266 vty->node = PCU_NODE;
267
268 return CMD_SUCCESS;
269}
270
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200271#define EGPRS_STR "EGPRS configuration\n"
272
273DEFUN(cfg_pcu_egprs,
274 cfg_pcu_egprs_cmd,
Jacob Erlbeck9b3d7e02016-01-19 10:44:42 +0100275 "egprs only",
276 EGPRS_STR "Use EGPRS and disable plain GPRS\n")
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200277{
278 struct gprs_rlcmac_bts *bts = bts_main_data();
279
280 bts->egprs_enabled = 1;
281
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200282 return CMD_SUCCESS;
283}
284
285DEFUN(cfg_pcu_no_egprs,
286 cfg_pcu_no_egprs_cmd,
287 "no egprs",
288 NO_STR EGPRS_STR)
289{
290 struct gprs_rlcmac_bts *bts = bts_main_data();
291
292 bts->egprs_enabled = 0;
293
294 return CMD_SUCCESS;
295}
296
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200297DEFUN(cfg_pcu_fc_interval,
298 cfg_pcu_fc_interval_cmd,
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200299 "flow-control-interval <1-10>",
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200300 "Interval between sending subsequent Flow Control PDUs\n"
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200301 "Interval time in seconds\n")
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200302{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200303 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200304
305 bts->fc_interval = atoi(argv[0]);
306
307 return CMD_SUCCESS;
308}
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200309#define FC_STR "BSSGP Flow Control configuration\n"
310#define FC_BMAX_STR(who) "Force a fixed value for the " who " bucket size\n"
311#define FC_LR_STR(who) "Force a fixed value for the " who " leak rate\n"
312
313DEFUN(cfg_pcu_fc_bvc_bucket_size,
314 cfg_pcu_fc_bvc_bucket_size_cmd,
315 "flow-control force-bvc-bucket-size <1-6553500>",
316 FC_STR FC_BMAX_STR("BVC") "Bucket size in octets\n")
317{
318 struct gprs_rlcmac_bts *bts = bts_main_data();
319
320 bts->fc_bvc_bucket_size = atoi(argv[0]);
321
322 return CMD_SUCCESS;
323}
324
325DEFUN(cfg_pcu_no_fc_bvc_bucket_size,
326 cfg_pcu_no_fc_bvc_bucket_size_cmd,
327 "no flow-control force-bvc-bucket-size",
328 NO_STR FC_STR FC_BMAX_STR("BVC"))
329{
330 struct gprs_rlcmac_bts *bts = bts_main_data();
331
332 bts->fc_bvc_bucket_size = 0;
333
334 return CMD_SUCCESS;
335}
336
337DEFUN(cfg_pcu_fc_bvc_leak_rate,
338 cfg_pcu_fc_bvc_leak_rate_cmd,
339 "flow-control force-bvc-leak-rate <1-6553500>",
340 FC_STR FC_LR_STR("BVC") "Leak rate in bit/s\n")
341{
342 struct gprs_rlcmac_bts *bts = bts_main_data();
343
344 bts->fc_bvc_leak_rate = atoi(argv[0]);
345
346 return CMD_SUCCESS;
347}
348
349DEFUN(cfg_pcu_no_fc_bvc_leak_rate,
350 cfg_pcu_no_fc_bvc_leak_rate_cmd,
351 "no flow-control force-bvc-leak-rate",
352 NO_STR FC_STR FC_LR_STR("BVC"))
353{
354 struct gprs_rlcmac_bts *bts = bts_main_data();
355
356 bts->fc_bvc_leak_rate = 0;
357
358 return CMD_SUCCESS;
359}
360
361DEFUN(cfg_pcu_fc_ms_bucket_size,
362 cfg_pcu_fc_ms_bucket_size_cmd,
363 "flow-control force-ms-bucket-size <1-6553500>",
364 FC_STR FC_BMAX_STR("default MS") "Bucket size in octets\n")
365{
366 struct gprs_rlcmac_bts *bts = bts_main_data();
367
368 bts->fc_ms_bucket_size = atoi(argv[0]);
369
370 return CMD_SUCCESS;
371}
372
373DEFUN(cfg_pcu_no_fc_ms_bucket_size,
374 cfg_pcu_no_fc_ms_bucket_size_cmd,
375 "no flow-control force-ms-bucket-size",
376 NO_STR FC_STR FC_BMAX_STR("default MS"))
377{
378 struct gprs_rlcmac_bts *bts = bts_main_data();
379
380 bts->fc_ms_bucket_size = 0;
381
382 return CMD_SUCCESS;
383}
384
385DEFUN(cfg_pcu_fc_ms_leak_rate,
386 cfg_pcu_fc_ms_leak_rate_cmd,
387 "flow-control force-ms-leak-rate <1-6553500>",
388 FC_STR FC_LR_STR("default MS") "Leak rate in bit/s\n")
389{
390 struct gprs_rlcmac_bts *bts = bts_main_data();
391
392 bts->fc_ms_leak_rate = atoi(argv[0]);
393
394 return CMD_SUCCESS;
395}
396
397DEFUN(cfg_pcu_no_fc_ms_leak_rate,
398 cfg_pcu_no_fc_ms_leak_rate_cmd,
399 "no flow-control force-ms-leak-rate",
400 NO_STR FC_STR FC_LR_STR("default MS"))
401{
402 struct gprs_rlcmac_bts *bts = bts_main_data();
403
404 bts->fc_ms_leak_rate = 0;
405
406 return CMD_SUCCESS;
407}
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200408
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200409#define FC_BTIME_STR "Set target downlink maximum queueing time (only affects the advertised bucket size)\n"
410DEFUN(cfg_pcu_fc_bucket_time,
411 cfg_pcu_fc_bucket_time_cmd,
412 "flow-control bucket-time <1-65534>",
413 FC_STR FC_BTIME_STR "Time in centi-seconds\n")
414{
415 struct gprs_rlcmac_bts *bts = bts_main_data();
416
417 bts->fc_bucket_time = atoi(argv[0]);
418
419 return CMD_SUCCESS;
420}
421
422DEFUN(cfg_pcu_no_fc_bucket_time,
423 cfg_pcu_no_fc_bucket_time_cmd,
424 "no flow-control bucket-time",
425 NO_STR FC_STR FC_BTIME_STR)
426{
427 struct gprs_rlcmac_bts *bts = bts_main_data();
428
429 bts->fc_bucket_time = 0;
430
431 return CMD_SUCCESS;
432}
433
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200434#define CS_STR "Coding Scheme configuration\n"
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200435
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200436DEFUN(cfg_pcu_cs,
437 cfg_pcu_cs_cmd,
Andreas Eversberg499ff412012-10-03 14:21:36 +0200438 "cs <1-4> [<1-4>]",
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200439 CS_STR
440 "Initial CS value to be used (overrides BTS config)\n"
441 "Use a different initial CS value for the uplink")
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200442{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200443 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200444 uint8_t cs = atoi(argv[0]);
445
446 bts->force_cs = 1;
Andreas Eversberg499ff412012-10-03 14:21:36 +0200447 bts->initial_cs_dl = cs;
448 if (argc > 1)
449 bts->initial_cs_ul = atoi(argv[1]);
450 else
451 bts->initial_cs_ul = cs;
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200452
453 return CMD_SUCCESS;
454}
455
456DEFUN(cfg_pcu_no_cs,
457 cfg_pcu_no_cs_cmd,
458 "no cs",
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200459 NO_STR CS_STR)
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200460{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200461 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200462
463 bts->force_cs = 0;
464
465 return CMD_SUCCESS;
466}
467
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100468#define CS_MAX_STR "Set maximum values for adaptive CS selection (overrides BTS config)\n"
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200469DEFUN(cfg_pcu_cs_max,
470 cfg_pcu_cs_max_cmd,
471 "cs max <1-4> [<1-4>]",
472 CS_STR
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100473 CS_MAX_STR
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200474 "Maximum CS value to be used\n"
475 "Use a different maximum CS value for the uplink")
476{
477 struct gprs_rlcmac_bts *bts = bts_main_data();
478 uint8_t cs = atoi(argv[0]);
479
480 bts->max_cs_dl = cs;
481 if (argc > 1)
482 bts->max_cs_ul = atoi(argv[1]);
483 else
484 bts->max_cs_ul = cs;
485
486 return CMD_SUCCESS;
487}
488
489DEFUN(cfg_pcu_no_cs_max,
490 cfg_pcu_no_cs_max_cmd,
491 "no cs max",
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100492 NO_STR CS_STR CS_MAX_STR)
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200493{
494 struct gprs_rlcmac_bts *bts = bts_main_data();
495
496 bts->max_cs_dl = 0;
497 bts->max_cs_ul = 0;
498
499 return CMD_SUCCESS;
500}
501
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100502#define MCS_STR "Modulation and Coding Scheme configuration (EGPRS)\n"
503
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +0100504DEFUN(cfg_pcu_mcs,
505 cfg_pcu_mcs_cmd,
506 "mcs <1-9> [<1-9>]",
507 MCS_STR
508 "Initial MCS value to be used (default 1)\n"
509 "Use a different initial MCS value for the uplink")
510{
511 struct gprs_rlcmac_bts *bts = bts_main_data();
512 uint8_t cs = atoi(argv[0]);
513
514 bts->initial_mcs_dl = cs;
515 if (argc > 1)
516 bts->initial_mcs_ul = atoi(argv[1]);
517 else
518 bts->initial_mcs_ul = cs;
519
520 return CMD_SUCCESS;
521}
522
523DEFUN(cfg_pcu_no_mcs,
524 cfg_pcu_no_mcs_cmd,
525 "no mcs",
526 NO_STR MCS_STR)
527{
528 struct gprs_rlcmac_bts *bts = bts_main_data();
529
530 bts->initial_mcs_dl = 1;
531 bts->initial_mcs_ul = 1;
532
533 return CMD_SUCCESS;
534}
535
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100536DEFUN(cfg_pcu_mcs_max,
537 cfg_pcu_mcs_max_cmd,
Jacob Erlbeckf9940ca2016-01-19 10:32:33 +0100538 "mcs max <1-9> [<1-9>]",
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100539 MCS_STR
540 CS_MAX_STR
541 "Maximum MCS value to be used\n"
542 "Use a different maximum MCS value for the uplink")
543{
544 struct gprs_rlcmac_bts *bts = bts_main_data();
545 uint8_t mcs = atoi(argv[0]);
546
547 bts->max_mcs_dl = mcs;
548 if (argc > 1)
549 bts->max_mcs_ul = atoi(argv[1]);
550 else
551 bts->max_mcs_ul = mcs;
552
553 return CMD_SUCCESS;
554}
555
556DEFUN(cfg_pcu_no_mcs_max,
557 cfg_pcu_no_mcs_max_cmd,
558 "no mcs max",
559 NO_STR MCS_STR CS_MAX_STR)
560{
561 struct gprs_rlcmac_bts *bts = bts_main_data();
562
563 bts->max_mcs_dl = 0;
564 bts->max_mcs_ul = 0;
565
566 return CMD_SUCCESS;
567}
568
Aravind Sirsikar50b09702016-08-22 17:21:10 +0530569#define DL_STR "downlink specific configuration\n"
570
571DEFUN(cfg_pcu_dl_arq_type,
572 cfg_pcu_dl_arq_cmd,
573 "egprs dl arq-type (spb|arq2)",
574 EGPRS_STR DL_STR "ARQ options\n"
575 "enable SPB(ARQ1) support\n"
576 "enable ARQ2 support")
577{
578 struct gprs_rlcmac_bts *bts = bts_main_data();
579
580 if (!strcmp(argv[0], "arq2"))
581 bts->dl_arq_type = 1;
582 else
583 bts->dl_arq_type = 0;
584
585 return CMD_SUCCESS;
586}
587
Jacob Erlbeck36df7742016-01-19 15:53:30 +0100588DEFUN(cfg_pcu_window_size,
589 cfg_pcu_window_size_cmd,
590 "window-size <0-1024> [<0-256>]",
591 "Window size configuration (b + N_PDCH * f)\n"
592 "Base value (b)\n"
593 "Factor for number of PDCH (f)")
594{
595 struct gprs_rlcmac_bts *bts = bts_main_data();
596 uint16_t b = atoi(argv[0]);
597
598 bts->ws_base = b;
599 if (argc > 1) {
600 uint16_t f = atoi(argv[1]);
601 bts->ws_pdch = f;
602 }
603
604 return CMD_SUCCESS;
605}
606
607
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200608#define QUEUE_STR "Packet queue options\n"
609#define LIFETIME_STR "Set lifetime limit of LLC frame in centi-seconds " \
610 "(overrides the value given by SGSN)\n"
611
612DEFUN(cfg_pcu_queue_lifetime,
613 cfg_pcu_queue_lifetime_cmd,
614 "queue lifetime <1-65534>",
615 QUEUE_STR LIFETIME_STR "Lifetime in centi-seconds")
616{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200617 struct gprs_rlcmac_bts *bts = bts_main_data();
Jacob Erlbeck2acfbeb2015-04-30 17:55:16 +0200618 uint16_t csec = atoi(argv[0]);
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200619
620 bts->force_llc_lifetime = csec;
621
622 return CMD_SUCCESS;
623}
624
625DEFUN(cfg_pcu_queue_lifetime_inf,
626 cfg_pcu_queue_lifetime_inf_cmd,
627 "queue lifetime infinite",
628 QUEUE_STR LIFETIME_STR "Infinite lifetime")
629{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200630 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200631
632 bts->force_llc_lifetime = 0xffff;
633
634 return CMD_SUCCESS;
635}
636
637DEFUN(cfg_pcu_no_queue_lifetime,
638 cfg_pcu_no_queue_lifetime_cmd,
639 "no queue lifetime",
640 NO_STR QUEUE_STR "Disable lifetime limit of LLC frame (use value given "
641 "by SGSN)\n")
642{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200643 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200644
645 bts->force_llc_lifetime = 0;
646
647 return CMD_SUCCESS;
648}
649
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100650#define QUEUE_HYSTERESIS_STR "Set lifetime hysteresis of LLC frame in centi-seconds " \
651 "(continue discarding until lifetime-hysteresis is reached)\n"
652
653DEFUN(cfg_pcu_queue_hysteresis,
654 cfg_pcu_queue_hysteresis_cmd,
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200655 "queue hysteresis <1-65535>",
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100656 QUEUE_STR QUEUE_HYSTERESIS_STR "Hysteresis in centi-seconds")
657{
658 struct gprs_rlcmac_bts *bts = bts_main_data();
Jacob Erlbeck2acfbeb2015-04-30 17:55:16 +0200659 uint16_t csec = atoi(argv[0]);
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100660
661 bts->llc_discard_csec = csec;
662
663 return CMD_SUCCESS;
664}
665
666DEFUN(cfg_pcu_no_queue_hysteresis,
667 cfg_pcu_no_queue_hysteresis_cmd,
668 "no queue hysteresis",
669 NO_STR QUEUE_STR QUEUE_HYSTERESIS_STR)
670{
671 struct gprs_rlcmac_bts *bts = bts_main_data();
672
673 bts->llc_discard_csec = 0;
674
675 return CMD_SUCCESS;
676}
677
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200678#define QUEUE_CODEL_STR "Set CoDel queue management\n"
679
680DEFUN(cfg_pcu_queue_codel,
681 cfg_pcu_queue_codel_cmd,
682 "queue codel",
683 QUEUE_STR QUEUE_CODEL_STR)
684{
685 struct gprs_rlcmac_bts *bts = bts_main_data();
686
687 bts->llc_codel_interval_msec = LLC_CODEL_USE_DEFAULT;
688
689 return CMD_SUCCESS;
690}
691
692DEFUN(cfg_pcu_queue_codel_interval,
693 cfg_pcu_queue_codel_interval_cmd,
694 "queue codel interval <1-1000>",
695 QUEUE_STR QUEUE_CODEL_STR "Specify interval\n" "Interval in centi-seconds")
696{
697 struct gprs_rlcmac_bts *bts = bts_main_data();
698 uint16_t csec = atoi(argv[0]);
699
700 bts->llc_codel_interval_msec = 10*csec;
701
702 return CMD_SUCCESS;
703}
704
705DEFUN(cfg_pcu_no_queue_codel,
706 cfg_pcu_no_queue_codel_cmd,
707 "no queue codel",
708 NO_STR QUEUE_STR QUEUE_CODEL_STR)
709{
710 struct gprs_rlcmac_bts *bts = bts_main_data();
711
712 bts->llc_codel_interval_msec = LLC_CODEL_DISABLE;
713
714 return CMD_SUCCESS;
715}
716
717
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200718#define QUEUE_IDLE_ACK_STR "Request an ACK after the last DL LLC frame in centi-seconds\n"
719
720DEFUN(cfg_pcu_queue_idle_ack_delay,
721 cfg_pcu_queue_idle_ack_delay_cmd,
722 "queue idle-ack-delay <1-65535>",
723 QUEUE_STR QUEUE_IDLE_ACK_STR "Idle ACK delay in centi-seconds")
724{
725 struct gprs_rlcmac_bts *bts = bts_main_data();
Jacob Erlbeck2acfbeb2015-04-30 17:55:16 +0200726 uint16_t csec = atoi(argv[0]);
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200727
728 bts->llc_idle_ack_csec = csec;
729
730 return CMD_SUCCESS;
731}
732
733DEFUN(cfg_pcu_no_queue_idle_ack_delay,
734 cfg_pcu_no_queue_idle_ack_delay_cmd,
735 "no queue idle-ack-delay",
736 NO_STR QUEUE_STR QUEUE_IDLE_ACK_STR)
737{
738 struct gprs_rlcmac_bts *bts = bts_main_data();
739
740 bts->llc_idle_ack_csec = 0;
741
742 return CMD_SUCCESS;
743}
744
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100745
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200746DEFUN(cfg_pcu_alloc,
747 cfg_pcu_alloc_cmd,
Jacob Erlbeck400ec022015-07-14 13:31:48 +0200748 "alloc-algorithm (a|b|dynamic)",
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200749 "Select slot allocation algorithm to use when assigning timeslots on "
Jacob Erlbeck400ec022015-07-14 13:31:48 +0200750 "PACCH\n"
751 "Single slot is assigned only\n"
752 "Multiple slots are assigned for semi-duplex operation\n"
753 "Dynamically select the algorithm based on the system state\n")
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200754{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200755 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200756
757 switch (argv[0][0]) {
758 case 'a':
759 bts->alloc_algorithm = alloc_algorithm_a;
760 break;
761 case 'b':
762 bts->alloc_algorithm = alloc_algorithm_b;
763 break;
Jacob Erlbeck400ec022015-07-14 13:31:48 +0200764 default:
765 bts->alloc_algorithm = alloc_algorithm_dynamic;
766 break;
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200767 }
768
769 return CMD_SUCCESS;
770}
771
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200772DEFUN(cfg_pcu_two_phase,
773 cfg_pcu_two_phase_cmd,
774 "two-phase-access",
775 "Force two phase access when MS requests single phase access\n")
776{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200777 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200778
779 bts->force_two_phase = 1;
780
781 return CMD_SUCCESS;
782}
783
784DEFUN(cfg_pcu_no_two_phase,
785 cfg_pcu_no_two_phase_cmd,
786 "no two-phase-access",
787 NO_STR "Only use two phase access when requested my MS\n")
788{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200789 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200790
791 bts->force_two_phase = 0;
792
793 return CMD_SUCCESS;
794}
795
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200796DEFUN(cfg_pcu_alpha,
797 cfg_pcu_alpha_cmd,
798 "alpha <0-10>",
799 "Alpha parameter for MS power control in units of 0.1 (see TS 05.08) "
800 "NOTE: Be sure to set Alpha value at System information 13 too.\n"
801 "Alpha in units of 0.1\n")
802{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200803 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200804
805 bts->alpha = atoi(argv[0]);
806
807 return CMD_SUCCESS;
808}
809
810DEFUN(cfg_pcu_gamma,
811 cfg_pcu_gamma_cmd,
812 "gamma <0-62>",
813 "Gamma parameter for MS power control in units of dB (see TS 05.08)\n"
814 "Gamma in even unit of dBs\n")
815{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200816 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200817
818 bts->gamma = atoi(argv[0]) / 2;
819
820 return CMD_SUCCESS;
821}
822
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +0100823DEFUN(show_bts_stats,
824 show_bts_stats_cmd,
825 "show bts statistics",
826 SHOW_STR "BTS related functionality\nStatistics\n")
827{
828 vty_out_rate_ctr_group(vty, "", bts_main_data_stats());
829 return CMD_SUCCESS;
Daniel Willmann772415f2014-01-15 17:06:51 +0100830}
831
Pau Espin Pedrola1ac2f02020-09-22 17:01:31 +0200832DEFUN(show_bts_pdch,
833 show_bts_pdch_cmd,
834 "show bts pdch",
835 SHOW_STR "BTS related functionality\nPDCH timeslots\n")
836{
837 return pcu_vty_show_bts_pdch(vty, bts_main_data());
838}
839
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100840#define IDLE_TIME_STR "keep an idle DL TBF alive for the time given\n"
Pau Espin Pedrol2b5c6292019-09-09 13:41:00 +0200841DEFUN_DEPRECATED(cfg_pcu_dl_tbf_idle_time,
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100842 cfg_pcu_dl_tbf_idle_time_cmd,
843 "dl-tbf-idle-time <1-5000>",
844 IDLE_TIME_STR "idle time in msec")
845{
Pau Espin Pedrol2b5c6292019-09-09 13:41:00 +0200846 vty_out(vty, "%% 'dl-tbf-idle-time' is now deprecated: use 'timer X2031 <val>' instead%s", VTY_NEWLINE);
847
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100848 struct gprs_rlcmac_bts *bts = bts_main_data();
849
Pau Espin Pedrol2b5c6292019-09-09 13:41:00 +0200850 if (osmo_tdef_set(bts->T_defs_pcu, -2031, atoi(argv[0]), OSMO_TDEF_MS) < 0)
851 return CMD_WARNING;
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100852 return CMD_SUCCESS;
853}
854
Pau Espin Pedrol2b5c6292019-09-09 13:41:00 +0200855DEFUN_DEPRECATED(cfg_pcu_no_dl_tbf_idle_time,
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100856 cfg_pcu_no_dl_tbf_idle_time_cmd,
857 "no dl-tbf-idle-time",
858 NO_STR IDLE_TIME_STR)
859{
Pau Espin Pedrol2b5c6292019-09-09 13:41:00 +0200860 vty_out(vty, "%% 'no dl-tbf-idle-time' is now deprecated: use 'timer X2031 0' instead%s", VTY_NEWLINE);
861
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100862 struct gprs_rlcmac_bts *bts = bts_main_data();
863
Pau Espin Pedrol2b5c6292019-09-09 13:41:00 +0200864 if (osmo_tdef_set(bts->T_defs_pcu, -2031, 0, OSMO_TDEF_MS) < 0)
865 return CMD_WARNING;
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100866 return CMD_SUCCESS;
867}
868
Oliver Smith45fdc442019-09-05 15:12:20 +0200869#define RETRANSMISSION_STR "retransmit blocks even before the MS had a chance to receive them (better throughput," \
870 " less readable traces)"
871DEFUN(cfg_pcu_dl_tbf_preemptive_retransmission,
872 cfg_pcu_dl_tbf_preemptive_retransmission_cmd,
873 "dl-tbf-preemptive-retransmission",
874 RETRANSMISSION_STR " (enabled by default)")
875{
876 struct gprs_rlcmac_bts *bts = bts_main_data();
877
878 bts->dl_tbf_preemptive_retransmission = true;
879
880 return CMD_SUCCESS;
881}
882
883DEFUN(cfg_pcu_no_dl_tbf_preemptive_retransmission,
884 cfg_pcu_no_dl_tbf_preemptive_retransmission_cmd,
885 "no dl-tbf-preemptive-retransmission",
886 NO_STR RETRANSMISSION_STR)
887{
888 struct gprs_rlcmac_bts *bts = bts_main_data();
889
890 bts->dl_tbf_preemptive_retransmission = false;
891
892 return CMD_SUCCESS;
893}
894
Jacob Erlbecka098c192015-05-28 16:11:19 +0200895#define MS_IDLE_TIME_STR "keep an idle MS object alive for the time given\n"
Pau Espin Pedrol63700ea2019-09-09 13:19:06 +0200896DEFUN_DEPRECATED(cfg_pcu_ms_idle_time,
Jacob Erlbecka098c192015-05-28 16:11:19 +0200897 cfg_pcu_ms_idle_time_cmd,
898 "ms-idle-time <1-7200>",
899 MS_IDLE_TIME_STR "idle time in sec")
900{
Pau Espin Pedrol63700ea2019-09-09 13:19:06 +0200901 vty_out(vty, "%% 'ms-idle-time' is now deprecated: use 'timer X2030 <val>' instead%s", VTY_NEWLINE);
902
Jacob Erlbecka098c192015-05-28 16:11:19 +0200903 struct gprs_rlcmac_bts *bts = bts_main_data();
904
Pau Espin Pedrol63700ea2019-09-09 13:19:06 +0200905 if (osmo_tdef_set(bts->T_defs_pcu, -2030, atoi(argv[0]), OSMO_TDEF_S) < 0)
906 return CMD_WARNING;
Jacob Erlbecka098c192015-05-28 16:11:19 +0200907 return CMD_SUCCESS;
908}
909
Pau Espin Pedrol63700ea2019-09-09 13:19:06 +0200910DEFUN_DEPRECATED(cfg_pcu_no_ms_idle_time,
Jacob Erlbecka098c192015-05-28 16:11:19 +0200911 cfg_pcu_no_ms_idle_time_cmd,
912 "no ms-idle-time",
913 NO_STR MS_IDLE_TIME_STR)
914{
Pau Espin Pedrol63700ea2019-09-09 13:19:06 +0200915 vty_out(vty, "%% 'no ms-idle-time' is now deprecated: use 'timer X2030 0' instead%s", VTY_NEWLINE);
916
Jacob Erlbecka098c192015-05-28 16:11:19 +0200917 struct gprs_rlcmac_bts *bts = bts_main_data();
918
Pau Espin Pedrol63700ea2019-09-09 13:19:06 +0200919 if (osmo_tdef_set(bts->T_defs_pcu, -2030, 0, OSMO_TDEF_S) < 0)
920 return CMD_WARNING;
Jacob Erlbecka098c192015-05-28 16:11:19 +0200921 return CMD_SUCCESS;
922}
923
Pau Espin Pedrol1e6eb302019-11-28 17:00:44 +0100924#define CS_ERR_LIMITS_STR "set thresholds for error rate based downlink (M)CS adjustment\n"
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200925DEFUN(cfg_pcu_cs_err_limits,
926 cfg_pcu_cs_err_limits_cmd,
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200927 "cs threshold <0-100> <0-100>",
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200928 CS_STR CS_ERR_LIMITS_STR "lower limit in %\n" "upper limit in %\n")
929{
930 struct gprs_rlcmac_bts *bts = bts_main_data();
931
932 uint8_t lower_limit = atoi(argv[0]);
933 uint8_t upper_limit = atoi(argv[1]);
934
935 if (lower_limit > upper_limit) {
936 vty_out(vty,
937 "The lower limit must be less than or equal to the "
938 "upper limit.%s", VTY_NEWLINE);
939 return CMD_WARNING;
940 }
941
942 bts->cs_adj_enabled = 1;
943 bts->cs_adj_upper_limit = upper_limit;
944 bts->cs_adj_lower_limit = lower_limit;
945
946 return CMD_SUCCESS;
947}
948
949DEFUN(cfg_pcu_no_cs_err_limits,
950 cfg_pcu_no_cs_err_limits_cmd,
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200951 "no cs threshold",
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200952 NO_STR CS_STR CS_ERR_LIMITS_STR)
953{
954 struct gprs_rlcmac_bts *bts = bts_main_data();
955
956 bts->cs_adj_enabled = 0;
957 bts->cs_adj_upper_limit = 100;
958 bts->cs_adj_lower_limit = 0;
959
960 return CMD_SUCCESS;
961}
962
Pau Espin Pedrol1e6eb302019-11-28 17:00:44 +0100963#define CS_DOWNGRADE_STR "set threshold for data size based downlink (M)CS downgrade\n"
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +0200964DEFUN(cfg_pcu_cs_downgrade_thrsh,
965 cfg_pcu_cs_downgrade_thrsh_cmd,
966 "cs downgrade-threshold <1-10000>",
967 CS_STR CS_DOWNGRADE_STR "downgrade if less octets left\n")
968{
969 struct gprs_rlcmac_bts *bts = bts_main_data();
970
971 bts->cs_downgrade_threshold = atoi(argv[0]);
972
973 return CMD_SUCCESS;
974}
975
976DEFUN(cfg_pcu_no_cs_downgrade_thrsh,
977 cfg_pcu_no_cs_downgrade_thrsh_cmd,
978 "no cs downgrade-threshold",
Jacob Erlbeckf1379342015-06-29 10:49:30 +0200979 NO_STR CS_STR CS_DOWNGRADE_STR)
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +0200980{
981 struct gprs_rlcmac_bts *bts = bts_main_data();
982
983 bts->cs_downgrade_threshold = 0;
984
985 return CMD_SUCCESS;
986}
987
988
Jacob Erlbeck94cde132015-06-09 09:44:36 +0200989DEFUN(cfg_pcu_cs_lqual_ranges,
990 cfg_pcu_cs_lqual_ranges_cmd,
991 "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 +0100992 CS_STR "Set link quality ranges for each uplink CS\n"
Jacob Erlbeck94cde132015-06-09 09:44:36 +0200993 "Set quality range for CS-1 (high value only)\n"
994 "CS-1 high (dB)\n"
995 "Set quality range for CS-2\n"
996 "CS-2 low (dB)\n"
997 "CS-2 high (dB)\n"
998 "Set quality range for CS-3\n"
999 "CS-3 low (dB)\n"
1000 "CS-3 high (dB)\n"
1001 "Set quality range for CS-4 (low value only)\n"
1002 "CS-4 low (dB)\n")
1003{
1004 struct gprs_rlcmac_bts *bts = bts_main_data();
1005
1006 uint8_t cs1_high = atoi(argv[0]);
1007 uint8_t cs2_low = atoi(argv[1]);
1008 uint8_t cs2_high = atoi(argv[2]);
1009 uint8_t cs3_low = atoi(argv[3]);
1010 uint8_t cs3_high = atoi(argv[4]);
1011 uint8_t cs4_low = atoi(argv[5]);
1012
1013 bts->cs_lqual_ranges[0].high = cs1_high;
1014 bts->cs_lqual_ranges[1].low = cs2_low;
1015 bts->cs_lqual_ranges[1].high = cs2_high;
1016 bts->cs_lqual_ranges[2].low = cs3_low;
1017 bts->cs_lqual_ranges[2].high = cs3_high;
1018 bts->cs_lqual_ranges[3].low = cs4_low;
1019
1020 return CMD_SUCCESS;
1021}
1022
Minh-Quang Nguyen1f189092017-08-16 09:50:06 -04001023DEFUN(cfg_pcu_mcs_lqual_ranges,
1024 cfg_pcu_mcs_lqual_ranges_cmd,
1025 "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 +01001026 CS_STR "Set link quality ranges for each uplink MCS\n"
Minh-Quang Nguyen1f189092017-08-16 09:50:06 -04001027 "Set quality range for MCS-1 (high value only)\n"
1028 "MCS-1 high (dB)\n"
1029 "Set quality range for MCS-2\n"
1030 "MCS-2 high (dB)\n"
1031 "MCS-2 low (dB)\n"
1032 "Set quality range for MCS-3\n"
1033 "MCS-3 high (dB)\n"
1034 "MCS-3 low (dB)\n"
1035 "Set quality range for MCS-4\n"
1036 "MCS-4 high (dB)\n"
1037 "MCS-4 low (dB)\n"
1038 "Set quality range for MCS-5\n"
1039 "MCS-5 high (dB)\n"
1040 "MCS-5 low (dB)\n"
1041 "Set quality range for MCS-6\n"
1042 "MCS-6 low (dB)\n"
1043 "MCS-6 high (dB)\n"
1044 "Set quality range for MCS-7\n"
1045 "MCS-7 low (dB)\n"
1046 "MCS-7 high (dB)\n"
1047 "Set quality range for MCS-8\n"
1048 "MCS-8 low (dB)\n"
1049 "MCS-8 high (dB)\n"
1050 "Set quality range for MCS-9 (low value only)\n"
1051 "MCS-9 low (dB)\n")
1052{
1053 struct gprs_rlcmac_bts *bts = bts_main_data();
1054
1055 bts->mcs_lqual_ranges[0].high = atoi(argv[0]);
1056 bts->mcs_lqual_ranges[1].low = atoi(argv[1]);
1057 bts->mcs_lqual_ranges[1].high = atoi(argv[2]);
1058 bts->mcs_lqual_ranges[2].low = atoi(argv[3]);
1059 bts->mcs_lqual_ranges[2].high = atoi(argv[4]);
1060 bts->mcs_lqual_ranges[3].low = atoi(argv[5]);
1061 bts->mcs_lqual_ranges[3].high = atoi(argv[6]);
1062 bts->mcs_lqual_ranges[4].low = atoi(argv[7]);
1063 bts->mcs_lqual_ranges[4].high = atoi(argv[8]);
1064 bts->mcs_lqual_ranges[5].low = atoi(argv[9]);
1065 bts->mcs_lqual_ranges[5].high = atoi(argv[10]);
1066 bts->mcs_lqual_ranges[6].low = atoi(argv[11]);
1067 bts->mcs_lqual_ranges[6].high = atoi(argv[12]);
1068 bts->mcs_lqual_ranges[7].low = atoi(argv[13]);
1069 bts->mcs_lqual_ranges[7].high = atoi(argv[14]);
1070 bts->mcs_lqual_ranges[8].low = atoi(argv[15]);
1071
1072 return CMD_SUCCESS;
1073}
1074
Pau Espin Pedrolc4178e52017-08-08 15:03:50 +02001075DEFUN(cfg_pcu_sock,
1076 cfg_pcu_sock_cmd,
1077 "pcu-socket PATH",
1078 "Configure the osmo-bts PCU socket file/path name\n"
1079 "Path of the socket to connect to\n")
1080{
1081 struct gprs_rlcmac_bts *bts = bts_main_data();
1082
Vadim Yanitskiyfc75cc02019-11-30 20:13:25 +07001083 if (vty->type != VTY_FILE)
1084 vty_out(vty, "Changing PCU socket path at run-time has no effect%s", VTY_NEWLINE);
1085
Vadim Yanitskiy657a4c02019-11-30 20:15:22 +07001086 osmo_talloc_replace_string(tall_pcu_ctx, &bts->pcu_sock_path, argv[0]);
Pau Espin Pedrolc4178e52017-08-08 15:03:50 +02001087
1088 return CMD_SUCCESS;
1089}
Jacob Erlbeck94cde132015-06-09 09:44:36 +02001090
Harald Welte57d35152018-07-05 03:11:17 +02001091DEFUN(cfg_pcu_gb_dialect,
1092 cfg_pcu_gb_dialect_cmd,
1093 "gb-dialect (classic|ip-sns)",
1094 "Select which Gb interface dialect to use\n"
1095 "Classic Gb interface with NS-{RESET,BLOCK,UNBLOCK} and static configuration\n"
1096 "Modern Gb interface with IP-SNS (Sub Network Service) and dynamic configuration\n")
1097{
1098 struct gprs_rlcmac_bts *bts = bts_main_data();
1099
Alexander Couzens290d9032020-09-16 21:52:02 +02001100 if (!strcmp(argv[0], "ip-sns")) {
Harald Welte57d35152018-07-05 03:11:17 +02001101 bts->gb_dialect_sns = true;
Alexander Couzens290d9032020-09-16 21:52:02 +02001102 gprs_ns2_vty_force_vc_mode(true, NS2_VC_MODE_ALIVE, "gb-dialect is ip-sns");
1103 } else {
Harald Welte57d35152018-07-05 03:11:17 +02001104 bts->gb_dialect_sns = false;
Alexander Couzens290d9032020-09-16 21:52:02 +02001105 gprs_ns2_vty_force_vc_mode(false, 0, NULL);
1106 }
Harald Welte57d35152018-07-05 03:11:17 +02001107
1108 return CMD_SUCCESS;
1109}
1110
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +02001111DEFUN(show_bts_timer, show_bts_timer_cmd,
1112 "show bts-timer " OSMO_TDEF_VTY_ARG_T_OPTIONAL,
1113 SHOW_STR "Show BTS controlled timers\n"
1114 OSMO_TDEF_VTY_DOC_T)
1115{
1116 struct gprs_rlcmac_bts *bts = bts_main_data();
1117 const char *T_arg = argc > 0 ? argv[0] : NULL;
1118 return osmo_tdef_vty_show_cmd(vty, bts->T_defs_bts, T_arg, NULL);
1119}
1120
1121DEFUN(show_timer, show_timer_cmd,
1122 "show timer " OSMO_TDEF_VTY_ARG_T_OPTIONAL,
1123 SHOW_STR "Show PCU timers\n"
1124 OSMO_TDEF_VTY_DOC_T)
1125{
1126 struct gprs_rlcmac_bts *bts = bts_main_data();
1127 const char *T_arg = argc > 0 ? argv[0] : NULL;
1128 return osmo_tdef_vty_show_cmd(vty, bts->T_defs_pcu, T_arg, NULL);
1129}
1130
1131DEFUN(cfg_pcu_timer, cfg_pcu_timer_cmd,
1132 "timer " OSMO_TDEF_VTY_ARG_SET_OPTIONAL,
1133 "Configure or show PCU timers\n"
1134 OSMO_TDEF_VTY_DOC_SET)
1135{
1136 struct gprs_rlcmac_bts *bts = bts_main_data();
1137 /* If any arguments are missing, redirect to 'show' */
1138 if (argc < 2)
1139 return show_timer(self, vty, argc, argv);
1140 return osmo_tdef_vty_set_cmd(vty, bts->T_defs_pcu, argv);
1141}
1142
Daniel Willmann772415f2014-01-15 17:06:51 +01001143DEFUN(show_tbf,
1144 show_tbf_cmd,
Max12a09872018-02-01 16:07:33 +01001145 "show tbf (all|ccch|pacch)",
1146 SHOW_STR "information about TBFs\n"
1147 "All TBFs\n"
1148 "TBFs allocated via CCCH\n"
1149 "TBFs allocated via PACCH\n")
Daniel Willmann772415f2014-01-15 17:06:51 +01001150{
1151 struct gprs_rlcmac_bts *bts = bts_main_data();
Vadim Yanitskiycef2f842019-10-09 21:52:50 +07001152 uint32_t flags = UINT32_MAX;
Max12a09872018-02-01 16:07:33 +01001153
Vadim Yanitskiycef2f842019-10-09 21:52:50 +07001154 if (argv[0][0] == 'c')
1155 flags = (1 << GPRS_RLCMAC_FLAG_CCCH);
1156 else if (argv[0][0] == 'p')
1157 flags = (1 << GPRS_RLCMAC_FLAG_PACCH);
Max12a09872018-02-01 16:07:33 +01001158
Vadim Yanitskiycef2f842019-10-09 21:52:50 +07001159 return pcu_vty_show_tbf_all(vty, bts, flags);
Daniel Willmann772415f2014-01-15 17:06:51 +01001160}
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +01001161
Jacob Erlbeckf47f68a2015-06-04 10:23:24 +02001162DEFUN(show_ms_all,
1163 show_ms_all_cmd,
1164 "show ms all",
1165 SHOW_STR "information about MSs\n" "All TBFs\n")
1166{
1167 struct gprs_rlcmac_bts *bts = bts_main_data();
1168 return pcu_vty_show_ms_all(vty, bts);
1169}
1170
Jacob Erlbeck37e896d2015-06-05 16:33:33 +02001171DEFUN(show_ms_tlli,
1172 show_ms_tlli_cmd,
1173 "show ms tlli TLLI",
1174 SHOW_STR "information about MSs\n" "Select MS by TLLI\n" "TLLI as hex\n")
1175{
1176 struct gprs_rlcmac_bts *bts = bts_main_data();
1177 char *endp = NULL;
1178 unsigned long long tlli = strtoll(argv[0], &endp, 16);
1179 if ((endp != NULL && *endp != 0) || tlli > 0xffffffffULL) {
1180 vty_out(vty, "Invalid TLLI.%s", VTY_NEWLINE);
1181 return CMD_WARNING;
1182 }
1183 return pcu_vty_show_ms_by_tlli(vty, bts, (uint32_t)tlli);
1184}
1185
1186DEFUN(show_ms_imsi,
1187 show_ms_imsi_cmd,
1188 "show ms imsi IMSI",
1189 SHOW_STR "information about MSs\n" "Select MS by IMSI\n" "IMSI\n")
1190{
1191 struct gprs_rlcmac_bts *bts = bts_main_data();
1192 return pcu_vty_show_ms_by_imsi(vty, bts, argv[0]);
1193}
1194
Andreas Eversberg12942562012-07-12 14:31:57 +02001195static const char pcu_copyright[] =
Harald Welted1e340f2013-01-17 12:24:29 +01001196 "Copyright (C) 2012 by Ivan Kluchnikov <kluchnikovi@gmail.com> and \r\n"
1197 " Andreas Eversberg <jolly@eversberg.eu>\r\n"
Andreas Eversberg12942562012-07-12 14:31:57 +02001198 "License GNU GPL version 2 or later\r\n"
1199 "This is free software: you are free to change and redistribute it.\r\n"
1200 "There is NO WARRANTY, to the extent permitted by law.\r\n";
1201
1202struct vty_app_info pcu_vty_info = {
Pau Espin Pedrold0fc9e82019-11-29 13:37:45 +01001203 .name = "OsmoPCU",
Andreas Eversberg12942562012-07-12 14:31:57 +02001204 .version = PACKAGE_VERSION,
1205 .copyright = pcu_copyright,
Andreas Eversberg12942562012-07-12 14:31:57 +02001206};
1207
Pau Espin Pedrolcd2ac562019-08-05 14:30:44 +02001208int pcu_vty_init(void)
Andreas Eversberg12942562012-07-12 14:31:57 +02001209{
1210// install_element_ve(&show_pcu_cmd);
1211
Harald Welte717cdf52017-07-21 21:56:23 +02001212 cfg_pcu_gsmtap_categ_cmd.string = vty_cmd_string_from_valstr(tall_pcu_ctx, pcu_gsmtap_categ_names,
1213 "gsmtap-category (",
1214 "|",")", VTY_DO_LOWER);
1215 cfg_pcu_gsmtap_categ_cmd.doc = vty_cmd_string_from_valstr(tall_pcu_ctx, pcu_gsmtap_categ_help,
1216 "GSMTAP Category\n",
1217 "\n", "", 0);
1218 cfg_pcu_no_gsmtap_categ_cmd.string = vty_cmd_string_from_valstr(tall_pcu_ctx, pcu_gsmtap_categ_names,
1219 "no gsmtap-category (",
1220 "|",")", VTY_DO_LOWER);
1221 cfg_pcu_no_gsmtap_categ_cmd.doc = vty_cmd_string_from_valstr(tall_pcu_ctx, pcu_gsmtap_categ_help,
1222 NO_STR "GSMTAP Category\n",
1223 "\n", "", 0);
1224
Pau Espin Pedrolcd2ac562019-08-05 14:30:44 +02001225 logging_vty_add_cmds();
1226 osmo_stats_vty_add_cmds();
Vadim Yanitskiyd83c8ff2020-02-06 16:46:17 +07001227 osmo_talloc_vty_add_cmds();
Andreas Eversberg12942562012-07-12 14:31:57 +02001228
Andreas Eversberg8b761a32012-07-20 21:50:31 +02001229 install_node(&pcu_node, config_write_pcu);
1230 install_element(CONFIG_NODE, &cfg_pcu_cmd);
Jacob Erlbeck953c7892015-09-28 18:12:57 +02001231 install_element(PCU_NODE, &cfg_pcu_egprs_cmd);
1232 install_element(PCU_NODE, &cfg_pcu_no_egprs_cmd);
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +02001233 install_element(PCU_NODE, &cfg_pcu_no_two_phase_cmd);
Andreas Eversberg8b761a32012-07-20 21:50:31 +02001234 install_element(PCU_NODE, &cfg_pcu_cs_cmd);
1235 install_element(PCU_NODE, &cfg_pcu_no_cs_cmd);
Jacob Erlbeckb33e6752015-06-04 19:04:30 +02001236 install_element(PCU_NODE, &cfg_pcu_cs_max_cmd);
1237 install_element(PCU_NODE, &cfg_pcu_no_cs_max_cmd);
Jacob Erlbeck8322d082015-06-04 15:12:10 +02001238 install_element(PCU_NODE, &cfg_pcu_cs_err_limits_cmd);
1239 install_element(PCU_NODE, &cfg_pcu_no_cs_err_limits_cmd);
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +02001240 install_element(PCU_NODE, &cfg_pcu_cs_downgrade_thrsh_cmd);
1241 install_element(PCU_NODE, &cfg_pcu_no_cs_downgrade_thrsh_cmd);
Jacob Erlbeck94cde132015-06-09 09:44:36 +02001242 install_element(PCU_NODE, &cfg_pcu_cs_lqual_ranges_cmd);
Minh-Quang Nguyen1f189092017-08-16 09:50:06 -04001243 install_element(PCU_NODE, &cfg_pcu_mcs_lqual_ranges_cmd);
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +01001244 install_element(PCU_NODE, &cfg_pcu_mcs_cmd);
Aravind Sirsikar50b09702016-08-22 17:21:10 +05301245 install_element(PCU_NODE, &cfg_pcu_dl_arq_cmd);
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +01001246 install_element(PCU_NODE, &cfg_pcu_no_mcs_cmd);
Jacob Erlbeck0d058052016-01-07 11:48:28 +01001247 install_element(PCU_NODE, &cfg_pcu_mcs_max_cmd);
1248 install_element(PCU_NODE, &cfg_pcu_no_mcs_max_cmd);
Jacob Erlbeck36df7742016-01-19 15:53:30 +01001249 install_element(PCU_NODE, &cfg_pcu_window_size_cmd);
Andreas Eversberg24131bf2012-07-21 11:09:58 +02001250 install_element(PCU_NODE, &cfg_pcu_queue_lifetime_cmd);
1251 install_element(PCU_NODE, &cfg_pcu_queue_lifetime_inf_cmd);
1252 install_element(PCU_NODE, &cfg_pcu_no_queue_lifetime_cmd);
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +01001253 install_element(PCU_NODE, &cfg_pcu_queue_hysteresis_cmd);
1254 install_element(PCU_NODE, &cfg_pcu_no_queue_hysteresis_cmd);
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +02001255 install_element(PCU_NODE, &cfg_pcu_queue_codel_cmd);
1256 install_element(PCU_NODE, &cfg_pcu_queue_codel_interval_cmd);
1257 install_element(PCU_NODE, &cfg_pcu_no_queue_codel_cmd);
Jacob Erlbeckd0261b72015-04-02 13:58:09 +02001258 install_element(PCU_NODE, &cfg_pcu_queue_idle_ack_delay_cmd);
1259 install_element(PCU_NODE, &cfg_pcu_no_queue_idle_ack_delay_cmd);
Andreas Eversberga1503fa2012-07-22 08:58:09 +02001260 install_element(PCU_NODE, &cfg_pcu_alloc_cmd);
Andreas Eversberg07e97cf2012-08-07 16:00:56 +02001261 install_element(PCU_NODE, &cfg_pcu_two_phase_cmd);
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +02001262 install_element(PCU_NODE, &cfg_pcu_fc_interval_cmd);
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +02001263 install_element(PCU_NODE, &cfg_pcu_fc_bucket_time_cmd);
1264 install_element(PCU_NODE, &cfg_pcu_no_fc_bucket_time_cmd);
Jacob Erlbeck87d73412015-04-21 12:56:48 +02001265 install_element(PCU_NODE, &cfg_pcu_fc_bvc_bucket_size_cmd);
1266 install_element(PCU_NODE, &cfg_pcu_no_fc_bvc_bucket_size_cmd);
1267 install_element(PCU_NODE, &cfg_pcu_fc_bvc_leak_rate_cmd);
1268 install_element(PCU_NODE, &cfg_pcu_no_fc_bvc_leak_rate_cmd);
1269 install_element(PCU_NODE, &cfg_pcu_fc_ms_bucket_size_cmd);
1270 install_element(PCU_NODE, &cfg_pcu_no_fc_ms_bucket_size_cmd);
1271 install_element(PCU_NODE, &cfg_pcu_fc_ms_leak_rate_cmd);
1272 install_element(PCU_NODE, &cfg_pcu_no_fc_ms_leak_rate_cmd);
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +02001273 install_element(PCU_NODE, &cfg_pcu_alpha_cmd);
1274 install_element(PCU_NODE, &cfg_pcu_gamma_cmd);
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +01001275 install_element(PCU_NODE, &cfg_pcu_dl_tbf_idle_time_cmd);
1276 install_element(PCU_NODE, &cfg_pcu_no_dl_tbf_idle_time_cmd);
Oliver Smith45fdc442019-09-05 15:12:20 +02001277 install_element(PCU_NODE, &cfg_pcu_dl_tbf_preemptive_retransmission_cmd);
1278 install_element(PCU_NODE, &cfg_pcu_no_dl_tbf_preemptive_retransmission_cmd);
Jacob Erlbecka098c192015-05-28 16:11:19 +02001279 install_element(PCU_NODE, &cfg_pcu_ms_idle_time_cmd);
1280 install_element(PCU_NODE, &cfg_pcu_no_ms_idle_time_cmd);
Harald Welte717cdf52017-07-21 21:56:23 +02001281 install_element(PCU_NODE, &cfg_pcu_gsmtap_categ_cmd);
1282 install_element(PCU_NODE, &cfg_pcu_no_gsmtap_categ_cmd);
Pau Espin Pedrolc4178e52017-08-08 15:03:50 +02001283 install_element(PCU_NODE, &cfg_pcu_sock_cmd);
Harald Welte57d35152018-07-05 03:11:17 +02001284 install_element(PCU_NODE, &cfg_pcu_gb_dialect_cmd);
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +02001285 install_element(PCU_NODE, &cfg_pcu_timer_cmd);
Andreas Eversberg8b761a32012-07-20 21:50:31 +02001286
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +01001287 install_element_ve(&show_bts_stats_cmd);
Pau Espin Pedrola1ac2f02020-09-22 17:01:31 +02001288 install_element_ve(&show_bts_pdch_cmd);
Daniel Willmann772415f2014-01-15 17:06:51 +01001289 install_element_ve(&show_tbf_cmd);
Jacob Erlbeckf47f68a2015-06-04 10:23:24 +02001290 install_element_ve(&show_ms_all_cmd);
Jacob Erlbeck37e896d2015-06-05 16:33:33 +02001291 install_element_ve(&show_ms_tlli_cmd);
1292 install_element_ve(&show_ms_imsi_cmd);
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +02001293 install_element_ve(&show_bts_timer_cmd);
1294 install_element_ve(&show_timer_cmd);
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +01001295
Andreas Eversberg12942562012-07-12 14:31:57 +02001296 return 0;
1297}