blob: 5e5dfbe57a5e31188fce332bb512b8dc262f1a24 [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
Philipp Maier9459ebd2020-09-29 23:31:33 +020024#define X(x) (1 << x)
25
Harald Welte717cdf52017-07-21 21:56:23 +020026extern void *tall_pcu_ctx;
27
28static const struct value_string pcu_gsmtap_categ_names[] = {
29 { PCU_GSMTAP_C_DL_UNKNOWN, "dl-unknown" },
30 { PCU_GSMTAP_C_DL_DUMMY, "dl-dummy" },
31 { PCU_GSMTAP_C_DL_CTRL, "dl-ctrl" },
32 { PCU_GSMTAP_C_DL_DATA_GPRS, "dl-data-gprs" },
33 { PCU_GSMTAP_C_DL_DATA_EGPRS, "dl-data-egprs" },
Harald Weltebc219d52017-07-29 13:42:27 +020034 { PCU_GSMTAP_C_DL_PTCCH, "dl-ptcch" },
Pau Espin Pedrol58543702019-09-30 19:07:16 +020035 { PCU_GSMTAP_C_DL_AGCH, "dl-agch" },
36 { PCU_GSMTAP_C_DL_PCH, "dl-pch" },
Harald Welte717cdf52017-07-21 21:56:23 +020037
38 { PCU_GSMTAP_C_UL_UNKNOWN, "ul-unknown" },
39 { PCU_GSMTAP_C_UL_DUMMY, "ul-dummy" },
40 { PCU_GSMTAP_C_UL_CTRL, "ul-ctrl" },
41 { PCU_GSMTAP_C_UL_DATA_GPRS, "ul-data-gprs" },
42 { PCU_GSMTAP_C_UL_DATA_EGPRS, "ul-data-egprs" },
Pau Espin Pedrol1ec211f2019-09-30 18:33:14 +020043 { PCU_GSMTAP_C_UL_RACH, "ul-rach" },
Vadim Yanitskiy07b64872020-06-11 00:26:15 +070044 { PCU_GSMTAP_C_UL_PTCCH, "ul-ptcch" },
Harald Welte717cdf52017-07-21 21:56:23 +020045
46 { 0, NULL }
47};
48
49static const struct value_string pcu_gsmtap_categ_help[] = {
50 { PCU_GSMTAP_C_DL_UNKNOWN, "Unknown / Unparseable / Erroneous Downlink Blocks" },
51 { PCU_GSMTAP_C_DL_DUMMY, "Downlink Dummy Blocks" },
52 { PCU_GSMTAP_C_DL_CTRL, "Downlink Control Blocks" },
53 { PCU_GSMTAP_C_DL_DATA_GPRS, "Downlink Data Blocks (GPRS)" },
54 { PCU_GSMTAP_C_DL_DATA_EGPRS, "Downlink Data Blocks (EGPRS)" },
Harald Weltebc219d52017-07-29 13:42:27 +020055 { PCU_GSMTAP_C_DL_PTCCH, "Downlink PTCCH Blocks" },
Pau Espin Pedrol58543702019-09-30 19:07:16 +020056 { PCU_GSMTAP_C_DL_AGCH, "Downlink AGCH Blocks" },
57 { PCU_GSMTAP_C_DL_PCH, "Downlink PCH Blocks" },
Harald Welte717cdf52017-07-21 21:56:23 +020058
59 { PCU_GSMTAP_C_UL_UNKNOWN, "Unknown / Unparseable / Erroneous Downlink Blocks" },
60 { PCU_GSMTAP_C_UL_DUMMY, "Uplink Dummy Blocks" },
61 { PCU_GSMTAP_C_UL_CTRL, "Uplink Control Blocks" },
62 { PCU_GSMTAP_C_UL_DATA_GPRS, "Uplink Data Blocks (GPRS)" },
63 { PCU_GSMTAP_C_UL_DATA_EGPRS, "Uplink Data Blocks (EGPRS)" },
Pau Espin Pedrol1ec211f2019-09-30 18:33:14 +020064 { PCU_GSMTAP_C_UL_RACH, "Uplink RACH Bursts" },
Vadim Yanitskiy07b64872020-06-11 00:26:15 +070065 { PCU_GSMTAP_C_UL_PTCCH, "Uplink PTCCH Bursts" },
Harald Welte717cdf52017-07-21 21:56:23 +020066
67 { 0, NULL }
68};
69
70
71DEFUN(cfg_pcu_gsmtap_categ, cfg_pcu_gsmtap_categ_cmd, "HIDDEN", "HIDDEN")
72{
73 struct gprs_rlcmac_bts *bts = bts_main_data();
74 int categ;
75
76 categ = get_string_value(pcu_gsmtap_categ_names, argv[0]);
77 if (categ < 0)
78 return CMD_WARNING;
79
80 bts->gsmtap_categ_mask |= (1 << categ);
81
82 return CMD_SUCCESS;
83}
84
85DEFUN(cfg_pcu_no_gsmtap_categ, cfg_pcu_no_gsmtap_categ_cmd, "HIDDEN", "HIDDEN")
86{
87 struct gprs_rlcmac_bts *bts = bts_main_data();
88 int categ;
89
90 categ = get_string_value(pcu_gsmtap_categ_names, argv[0]);
91 if (categ < 0)
92 return CMD_WARNING;
93
94 bts->gsmtap_categ_mask &= ~(1 << categ);
95
96 return CMD_SUCCESS;
97}
98
Andreas Eversberg8b761a32012-07-20 21:50:31 +020099static struct cmd_node pcu_node = {
100 (enum node_type) PCU_NODE,
Jacob Erlbeckcc12f022015-04-09 15:45:24 +0200101 "%s(config-pcu)# ",
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200102 1,
103};
104
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200105static int config_write_pcu(struct vty *vty)
106{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200107 struct gprs_rlcmac_bts *bts = bts_main_data();
Harald Welte717cdf52017-07-21 21:56:23 +0200108 unsigned int i;
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200109
110 vty_out(vty, "pcu%s", VTY_NEWLINE);
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200111 vty_out(vty, " flow-control-interval %d%s", bts->fc_interval,
112 VTY_NEWLINE);
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200113 if (bts->fc_bvc_bucket_size)
114 vty_out(vty, " flow-control force-bvc-bucket-size %d%s",
115 bts->fc_bvc_bucket_size, VTY_NEWLINE);
116 if (bts->fc_bvc_leak_rate)
117 vty_out(vty, " flow-control force-bvc-leak-rate %d%s",
118 bts->fc_bvc_leak_rate, VTY_NEWLINE);
119 if (bts->fc_ms_bucket_size)
120 vty_out(vty, " flow-control force-ms-bucket-size %d%s",
121 bts->fc_ms_bucket_size, VTY_NEWLINE);
122 if (bts->fc_ms_leak_rate)
123 vty_out(vty, " flow-control force-ms-leak-rate %d%s",
124 bts->fc_ms_leak_rate, VTY_NEWLINE);
Holger Hans Peter Freytherc421e8a2014-07-02 14:55:17 +0200125 if (bts->force_cs) {
Andreas Eversberg499ff412012-10-03 14:21:36 +0200126 if (bts->initial_cs_ul == bts->initial_cs_dl)
127 vty_out(vty, " cs %d%s", bts->initial_cs_dl,
128 VTY_NEWLINE);
129 else
130 vty_out(vty, " cs %d %d%s", bts->initial_cs_dl,
131 bts->initial_cs_ul, VTY_NEWLINE);
Holger Hans Peter Freytherc421e8a2014-07-02 14:55:17 +0200132 }
Pau Espin Pedrol343ec9b2020-10-30 18:35:54 +0100133 if (bts->vty.max_cs_dl && bts->vty.max_cs_ul) {
134 if (bts->vty.max_cs_ul == bts->vty.max_cs_dl)
135 vty_out(vty, " cs max %d%s", bts->vty.max_cs_dl,
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200136 VTY_NEWLINE);
137 else
Pau Espin Pedrol343ec9b2020-10-30 18:35:54 +0100138 vty_out(vty, " cs max %d %d%s", bts->vty.max_cs_dl,
139 bts->vty.max_cs_ul, VTY_NEWLINE);
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200140 }
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200141 if (bts->cs_adj_enabled)
142 vty_out(vty, " cs threshold %d %d%s",
143 bts->cs_adj_lower_limit, bts->cs_adj_upper_limit,
144 VTY_NEWLINE);
145 else
146 vty_out(vty, " no cs threshold%s", VTY_NEWLINE);
147
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +0200148 if (bts->cs_downgrade_threshold)
149 vty_out(vty, " cs downgrade-threshold %d%s",
150 bts->cs_downgrade_threshold, VTY_NEWLINE);
151 else
152 vty_out(vty, " no cs downgrade-threshold%s", VTY_NEWLINE);
153
Jacob Erlbeck94cde132015-06-09 09:44:36 +0200154 vty_out(vty, " cs link-quality-ranges cs1 %d cs2 %d %d cs3 %d %d cs4 %d%s",
155 bts->cs_lqual_ranges[0].high,
156 bts->cs_lqual_ranges[1].low,
157 bts->cs_lqual_ranges[1].high,
158 bts->cs_lqual_ranges[2].low,
159 bts->cs_lqual_ranges[2].high,
160 bts->cs_lqual_ranges[3].low,
161 VTY_NEWLINE);
162
Minh-Quang Nguyen1f189092017-08-16 09:50:06 -0400163 vty_out(vty, " mcs link-quality-ranges mcs1 %d mcs2 %d %d mcs3 %d %d mcs4 %d %d mcs5 %d %d mcs6 %d %d mcs7 %d %d mcs8 %d %d mcs9 %d%s",
164 bts->mcs_lqual_ranges[0].high,
165 bts->mcs_lqual_ranges[1].low,
166 bts->mcs_lqual_ranges[1].high,
167 bts->mcs_lqual_ranges[2].low,
168 bts->mcs_lqual_ranges[2].high,
169 bts->mcs_lqual_ranges[3].low,
170 bts->mcs_lqual_ranges[3].high,
171 bts->mcs_lqual_ranges[4].low,
172 bts->mcs_lqual_ranges[4].high,
173 bts->mcs_lqual_ranges[5].low,
174 bts->mcs_lqual_ranges[5].high,
175 bts->mcs_lqual_ranges[6].low,
176 bts->mcs_lqual_ranges[6].high,
177 bts->mcs_lqual_ranges[7].low,
178 bts->mcs_lqual_ranges[7].high,
179 bts->mcs_lqual_ranges[8].low,
180 VTY_NEWLINE);
181
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +0100182 if (bts->initial_mcs_dl != 1 && bts->initial_mcs_ul != 1) {
183 if (bts->initial_mcs_ul == bts->initial_mcs_dl)
184 vty_out(vty, " mcs %d%s", bts->initial_mcs_dl,
185 VTY_NEWLINE);
186 else
187 vty_out(vty, " mcs %d %d%s", bts->initial_mcs_dl,
188 bts->initial_mcs_ul, VTY_NEWLINE);
189 }
Minh-Quang Nguyen1f189092017-08-16 09:50:06 -0400190
Pau Espin Pedrol343ec9b2020-10-30 18:35:54 +0100191 if (bts->vty.max_mcs_dl && bts->vty.max_mcs_ul) {
192 if (bts->vty.max_mcs_ul == bts->vty.max_mcs_dl)
193 vty_out(vty, " mcs max %d%s", bts->vty.max_mcs_dl,
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100194 VTY_NEWLINE);
195 else
Pau Espin Pedrol343ec9b2020-10-30 18:35:54 +0100196 vty_out(vty, " mcs max %d %d%s", bts->vty.max_mcs_dl,
197 bts->vty.max_mcs_ul, VTY_NEWLINE);
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100198 }
199
Jacob Erlbeck36df7742016-01-19 15:53:30 +0100200 vty_out(vty, " window-size %d %d%s", bts->ws_base, bts->ws_pdch,
201 VTY_NEWLINE);
202
Aravind Sirsikar50b09702016-08-22 17:21:10 +0530203 if (bts->dl_arq_type)
204 vty_out(vty, " egprs dl arq-type arq2%s",
205 VTY_NEWLINE);
206
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200207 if (bts->force_llc_lifetime == 0xffff)
208 vty_out(vty, " queue lifetime infinite%s", VTY_NEWLINE);
209 else if (bts->force_llc_lifetime)
210 vty_out(vty, " queue lifetime %d%s", bts->force_llc_lifetime,
211 VTY_NEWLINE);
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100212 if (bts->llc_discard_csec)
213 vty_out(vty, " queue hysteresis %d%s", bts->llc_discard_csec,
214 VTY_NEWLINE);
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200215 if (bts->llc_idle_ack_csec)
216 vty_out(vty, " queue idle-ack-delay %d%s", bts->llc_idle_ack_csec,
217 VTY_NEWLINE);
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200218 if (bts->llc_codel_interval_msec == LLC_CODEL_USE_DEFAULT)
219 vty_out(vty, " queue codel%s", VTY_NEWLINE);
220 else if (bts->llc_codel_interval_msec == LLC_CODEL_DISABLE)
221 vty_out(vty, " no queue codel%s", VTY_NEWLINE);
222 else
223 vty_out(vty, " queue codel interval %d%s",
224 bts->llc_codel_interval_msec/10, VTY_NEWLINE);
225
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200226 if (bts->alloc_algorithm == alloc_algorithm_a)
227 vty_out(vty, " alloc-algorithm a%s", VTY_NEWLINE);
228 if (bts->alloc_algorithm == alloc_algorithm_b)
229 vty_out(vty, " alloc-algorithm b%s", VTY_NEWLINE);
Jacob Erlbeck400ec022015-07-14 13:31:48 +0200230 if (bts->alloc_algorithm == alloc_algorithm_dynamic)
231 vty_out(vty, " alloc-algorithm dynamic%s", VTY_NEWLINE);
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200232 if (bts->force_two_phase)
233 vty_out(vty, " two-phase-access%s", VTY_NEWLINE);
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200234 vty_out(vty, " alpha %d%s", bts->alpha, VTY_NEWLINE);
235 vty_out(vty, " gamma %d%s", bts->gamma * 2, VTY_NEWLINE);
Oliver Smith45fdc442019-09-05 15:12:20 +0200236 if (!bts->dl_tbf_preemptive_retransmission)
237 vty_out(vty, " no dl-tbf-preemptive-retransmission%s", VTY_NEWLINE);
Pau Espin Pedrolc4178e52017-08-08 15:03:50 +0200238 if (strcmp(bts->pcu_sock_path, PCU_SOCK_DEFAULT))
239 vty_out(vty, " pcu-socket %s%s", bts->pcu_sock_path, VTY_NEWLINE);
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200240
Harald Welte717cdf52017-07-21 21:56:23 +0200241 for (i = 0; i < 32; i++) {
242 unsigned int cs = (1 << i);
243 if (bts->gsmtap_categ_mask & cs) {
244 vty_out(vty, " gsmtap-category %s%s",
245 get_value_string(pcu_gsmtap_categ_names, i), VTY_NEWLINE);
246 }
247 }
248
Harald Welte57d35152018-07-05 03:11:17 +0200249 if (bts->gb_dialect_sns)
250 vty_out(vty, " gb-dialect ip-sns%s", VTY_NEWLINE);
251 else
252 vty_out(vty, " gb-dialect classic%s", VTY_NEWLINE);
253
Pau Espin Pedrol18794422019-09-26 18:25:35 +0200254 osmo_tdef_vty_write(vty, bts->T_defs_pcu, " timer ");
255
Maxc9ce6f92018-01-30 17:53:02 +0100256 return CMD_SUCCESS;
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200257}
258
259/* per-BTS configuration */
Philipp Maier9459ebd2020-09-29 23:31:33 +0200260DEFUN_ATTR(cfg_pcu,
261 cfg_pcu_cmd,
262 "pcu",
263 "BTS specific configure",
264 CMD_ATTR_IMMEDIATE)
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200265{
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
Pau Espin Pedrol270c9ea2020-10-30 17:15:32 +0100273DEFUN_DEPRECATED(cfg_pcu_egprs,
274 cfg_pcu_egprs_cmd,
275 "egprs only",
276 EGPRS_STR "Use EGPRS and disable plain GPRS\n")
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200277{
Pau Espin Pedrol270c9ea2020-10-30 17:15:32 +0100278 vty_out (vty, "'egprs only' is deprecated, egprs support is controled from BTS/BSC config, this is now a no-op%s", VTY_NEWLINE);
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200279 return CMD_SUCCESS;
280}
281
Pau Espin Pedrol270c9ea2020-10-30 17:15:32 +0100282DEFUN_DEPRECATED(cfg_pcu_no_egprs,
283 cfg_pcu_no_egprs_cmd,
284 "no egprs",
285 NO_STR EGPRS_STR)
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200286{
Pau Espin Pedrol270c9ea2020-10-30 17:15:32 +0100287 vty_out (vty, "'no egprs only' is deprecated, egprs support is controled from BTS/BSC config, this is now a no-op%s", VTY_NEWLINE);
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200288 return CMD_SUCCESS;
289}
290
Philipp Maier9459ebd2020-09-29 23:31:33 +0200291DEFUN_ATTR(cfg_pcu_fc_interval,
292 cfg_pcu_fc_interval_cmd,
293 "flow-control-interval <1-10>",
294 "Interval between sending subsequent Flow Control PDUs\n"
295 "Interval time in seconds\n",
296 CMD_ATTR_IMMEDIATE)
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200297{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200298 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200299
300 bts->fc_interval = atoi(argv[0]);
301
302 return CMD_SUCCESS;
303}
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200304#define FC_STR "BSSGP Flow Control configuration\n"
305#define FC_BMAX_STR(who) "Force a fixed value for the " who " bucket size\n"
306#define FC_LR_STR(who) "Force a fixed value for the " who " leak rate\n"
307
Philipp Maier9459ebd2020-09-29 23:31:33 +0200308DEFUN_ATTR(cfg_pcu_fc_bvc_bucket_size,
309 cfg_pcu_fc_bvc_bucket_size_cmd,
310 "flow-control force-bvc-bucket-size <1-6553500>",
311 FC_STR FC_BMAX_STR("BVC") "Bucket size in octets\n",
312 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200313{
314 struct gprs_rlcmac_bts *bts = bts_main_data();
315
316 bts->fc_bvc_bucket_size = atoi(argv[0]);
317
318 return CMD_SUCCESS;
319}
320
Philipp Maier9459ebd2020-09-29 23:31:33 +0200321DEFUN_ATTR(cfg_pcu_no_fc_bvc_bucket_size,
322 cfg_pcu_no_fc_bvc_bucket_size_cmd,
323 "no flow-control force-bvc-bucket-size",
324 NO_STR FC_STR FC_BMAX_STR("BVC"),
325 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200326{
327 struct gprs_rlcmac_bts *bts = bts_main_data();
328
329 bts->fc_bvc_bucket_size = 0;
330
331 return CMD_SUCCESS;
332}
333
Philipp Maier9459ebd2020-09-29 23:31:33 +0200334DEFUN_ATTR(cfg_pcu_fc_bvc_leak_rate,
335 cfg_pcu_fc_bvc_leak_rate_cmd,
336 "flow-control force-bvc-leak-rate <1-6553500>",
337 FC_STR FC_LR_STR("BVC") "Leak rate in bit/s\n",
338 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200339{
340 struct gprs_rlcmac_bts *bts = bts_main_data();
341
342 bts->fc_bvc_leak_rate = atoi(argv[0]);
343
344 return CMD_SUCCESS;
345}
346
Philipp Maier9459ebd2020-09-29 23:31:33 +0200347DEFUN_ATTR(cfg_pcu_no_fc_bvc_leak_rate,
348 cfg_pcu_no_fc_bvc_leak_rate_cmd,
349 "no flow-control force-bvc-leak-rate",
350 NO_STR FC_STR FC_LR_STR("BVC"),
351 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200352{
353 struct gprs_rlcmac_bts *bts = bts_main_data();
354
355 bts->fc_bvc_leak_rate = 0;
356
357 return CMD_SUCCESS;
358}
359
Philipp Maier9459ebd2020-09-29 23:31:33 +0200360DEFUN_ATTR(cfg_pcu_fc_ms_bucket_size,
361 cfg_pcu_fc_ms_bucket_size_cmd,
362 "flow-control force-ms-bucket-size <1-6553500>",
363 FC_STR FC_BMAX_STR("default MS") "Bucket size in octets\n",
364 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200365{
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
Philipp Maier9459ebd2020-09-29 23:31:33 +0200373DEFUN_ATTR(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 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200378{
379 struct gprs_rlcmac_bts *bts = bts_main_data();
380
381 bts->fc_ms_bucket_size = 0;
382
383 return CMD_SUCCESS;
384}
385
Philipp Maier9459ebd2020-09-29 23:31:33 +0200386DEFUN_ATTR(cfg_pcu_fc_ms_leak_rate,
387 cfg_pcu_fc_ms_leak_rate_cmd,
388 "flow-control force-ms-leak-rate <1-6553500>",
389 FC_STR FC_LR_STR("default MS") "Leak rate in bit/s\n",
390 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200391{
392 struct gprs_rlcmac_bts *bts = bts_main_data();
393
394 bts->fc_ms_leak_rate = atoi(argv[0]);
395
396 return CMD_SUCCESS;
397}
398
Philipp Maier9459ebd2020-09-29 23:31:33 +0200399DEFUN_ATTR(cfg_pcu_no_fc_ms_leak_rate,
400 cfg_pcu_no_fc_ms_leak_rate_cmd,
401 "no flow-control force-ms-leak-rate",
402 NO_STR FC_STR FC_LR_STR("default MS"),
403 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200404{
405 struct gprs_rlcmac_bts *bts = bts_main_data();
406
407 bts->fc_ms_leak_rate = 0;
408
409 return CMD_SUCCESS;
410}
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200411
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200412#define FC_BTIME_STR "Set target downlink maximum queueing time (only affects the advertised bucket size)\n"
Philipp Maier9459ebd2020-09-29 23:31:33 +0200413DEFUN_ATTR(cfg_pcu_fc_bucket_time,
414 cfg_pcu_fc_bucket_time_cmd,
415 "flow-control bucket-time <1-65534>",
416 FC_STR FC_BTIME_STR "Time in centi-seconds\n",
417 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200418{
419 struct gprs_rlcmac_bts *bts = bts_main_data();
420
421 bts->fc_bucket_time = atoi(argv[0]);
422
423 return CMD_SUCCESS;
424}
425
Philipp Maier9459ebd2020-09-29 23:31:33 +0200426DEFUN_ATTR(cfg_pcu_no_fc_bucket_time,
427 cfg_pcu_no_fc_bucket_time_cmd,
428 "no flow-control bucket-time",
429 NO_STR FC_STR FC_BTIME_STR,
430 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200431{
432 struct gprs_rlcmac_bts *bts = bts_main_data();
433
434 bts->fc_bucket_time = 0;
435
436 return CMD_SUCCESS;
437}
438
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200439#define CS_STR "Coding Scheme configuration\n"
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200440
Philipp Maier9459ebd2020-09-29 23:31:33 +0200441DEFUN_ATTR(cfg_pcu_cs,
442 cfg_pcu_cs_cmd,
443 "cs <1-4> [<1-4>]",
444 CS_STR
445 "Initial CS value to be used (overrides BTS config)\n"
446 "Use a different initial CS value for the uplink",
447 CMD_ATTR_IMMEDIATE)
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200448{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200449 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200450 uint8_t cs = atoi(argv[0]);
451
452 bts->force_cs = 1;
Andreas Eversberg499ff412012-10-03 14:21:36 +0200453 bts->initial_cs_dl = cs;
454 if (argc > 1)
455 bts->initial_cs_ul = atoi(argv[1]);
456 else
457 bts->initial_cs_ul = cs;
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200458
459 return CMD_SUCCESS;
460}
461
Philipp Maier9459ebd2020-09-29 23:31:33 +0200462DEFUN_ATTR(cfg_pcu_no_cs,
463 cfg_pcu_no_cs_cmd,
464 "no cs",
465 NO_STR CS_STR,
466 CMD_ATTR_IMMEDIATE)
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200467{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200468 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200469
470 bts->force_cs = 0;
471
472 return CMD_SUCCESS;
473}
474
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100475#define CS_MAX_STR "Set maximum values for adaptive CS selection (overrides BTS config)\n"
Philipp Maier9459ebd2020-09-29 23:31:33 +0200476DEFUN_ATTR(cfg_pcu_cs_max,
477 cfg_pcu_cs_max_cmd,
478 "cs max <1-4> [<1-4>]",
479 CS_STR
480 CS_MAX_STR
481 "Maximum CS value to be used\n"
482 "Use a different maximum CS value for the uplink",
483 CMD_ATTR_IMMEDIATE)
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200484{
485 struct gprs_rlcmac_bts *bts = bts_main_data();
Pau Espin Pedrol343ec9b2020-10-30 18:35:54 +0100486 uint8_t cs_dl = atoi(argv[0]);
487 uint8_t cs_ul;
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200488
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200489 if (argc > 1)
Pau Espin Pedrol343ec9b2020-10-30 18:35:54 +0100490 cs_ul = atoi(argv[1]);
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200491 else
Pau Espin Pedrol343ec9b2020-10-30 18:35:54 +0100492 cs_ul = cs_dl;
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200493
Pau Espin Pedrol343ec9b2020-10-30 18:35:54 +0100494 bts_set_max_cs(bts, cs_dl, cs_ul);
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200495 return CMD_SUCCESS;
496}
497
Philipp Maier9459ebd2020-09-29 23:31:33 +0200498DEFUN_ATTR(cfg_pcu_no_cs_max,
499 cfg_pcu_no_cs_max_cmd,
500 "no cs max",
501 NO_STR CS_STR CS_MAX_STR,
502 CMD_ATTR_IMMEDIATE)
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200503{
504 struct gprs_rlcmac_bts *bts = bts_main_data();
505
Pau Espin Pedrol343ec9b2020-10-30 18:35:54 +0100506 bts_set_max_cs(bts, 0, 0);
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200507 return CMD_SUCCESS;
508}
509
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100510#define MCS_STR "Modulation and Coding Scheme configuration (EGPRS)\n"
Philipp Maier9459ebd2020-09-29 23:31:33 +0200511DEFUN_ATTR(cfg_pcu_mcs,
512 cfg_pcu_mcs_cmd,
513 "mcs <1-9> [<1-9>]",
514 MCS_STR
515 "Initial MCS value to be used (default 1)\n"
516 "Use a different initial MCS value for the uplink",
517 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +0100518{
519 struct gprs_rlcmac_bts *bts = bts_main_data();
520 uint8_t cs = atoi(argv[0]);
521
522 bts->initial_mcs_dl = cs;
523 if (argc > 1)
524 bts->initial_mcs_ul = atoi(argv[1]);
525 else
526 bts->initial_mcs_ul = cs;
527
528 return CMD_SUCCESS;
529}
530
Philipp Maier9459ebd2020-09-29 23:31:33 +0200531DEFUN_ATTR(cfg_pcu_no_mcs,
532 cfg_pcu_no_mcs_cmd,
533 "no mcs",
534 NO_STR MCS_STR,
535 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +0100536{
537 struct gprs_rlcmac_bts *bts = bts_main_data();
538
539 bts->initial_mcs_dl = 1;
540 bts->initial_mcs_ul = 1;
541
542 return CMD_SUCCESS;
543}
544
Philipp Maier9459ebd2020-09-29 23:31:33 +0200545DEFUN_ATTR(cfg_pcu_mcs_max,
546 cfg_pcu_mcs_max_cmd,
547 "mcs max <1-9> [<1-9>]",
548 MCS_STR
549 CS_MAX_STR
550 "Maximum MCS value to be used\n"
551 "Use a different maximum MCS value for the uplink",
552 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100553{
554 struct gprs_rlcmac_bts *bts = bts_main_data();
Pau Espin Pedrol343ec9b2020-10-30 18:35:54 +0100555 uint8_t mcs_dl = atoi(argv[0]);
556 uint8_t mcs_ul;
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100557
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100558 if (argc > 1)
Pau Espin Pedrol343ec9b2020-10-30 18:35:54 +0100559 mcs_ul = atoi(argv[1]);
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100560 else
Pau Espin Pedrol343ec9b2020-10-30 18:35:54 +0100561 mcs_ul = mcs_dl;
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100562
Pau Espin Pedrol343ec9b2020-10-30 18:35:54 +0100563 bts_set_max_mcs(bts, mcs_dl, mcs_ul);
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100564 return CMD_SUCCESS;
565}
566
Philipp Maier9459ebd2020-09-29 23:31:33 +0200567DEFUN_ATTR(cfg_pcu_no_mcs_max,
568 cfg_pcu_no_mcs_max_cmd,
569 "no mcs max",
570 NO_STR MCS_STR CS_MAX_STR,
571 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100572{
573 struct gprs_rlcmac_bts *bts = bts_main_data();
574
Pau Espin Pedrol343ec9b2020-10-30 18:35:54 +0100575 bts_set_max_mcs(bts, 0, 0);
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100576 return CMD_SUCCESS;
577}
578
Aravind Sirsikar50b09702016-08-22 17:21:10 +0530579#define DL_STR "downlink specific configuration\n"
580
Philipp Maier9459ebd2020-09-29 23:31:33 +0200581DEFUN_ATTR(cfg_pcu_dl_arq_type,
582 cfg_pcu_dl_arq_cmd,
583 "egprs dl arq-type (spb|arq2)",
584 EGPRS_STR DL_STR "ARQ options\n"
585 "enable SPB(ARQ1) support\n"
586 "enable ARQ2 support",
587 CMD_ATTR_IMMEDIATE)
Aravind Sirsikar50b09702016-08-22 17:21:10 +0530588{
589 struct gprs_rlcmac_bts *bts = bts_main_data();
590
591 if (!strcmp(argv[0], "arq2"))
592 bts->dl_arq_type = 1;
593 else
594 bts->dl_arq_type = 0;
595
596 return CMD_SUCCESS;
597}
598
Philipp Maier9459ebd2020-09-29 23:31:33 +0200599DEFUN_USRATTR(cfg_pcu_window_size,
600 cfg_pcu_window_size_cmd,
601 X(PCU_VTY_ATTR_NEW_TBF),
602 "window-size <0-1024> [<0-256>]",
603 "Window size configuration (b + N_PDCH * f)\n"
604 "Base value (b)\n"
605 "Factor for number of PDCH (f)")
Jacob Erlbeck36df7742016-01-19 15:53:30 +0100606{
607 struct gprs_rlcmac_bts *bts = bts_main_data();
608 uint16_t b = atoi(argv[0]);
609
610 bts->ws_base = b;
611 if (argc > 1) {
612 uint16_t f = atoi(argv[1]);
613 bts->ws_pdch = f;
614 }
615
616 return CMD_SUCCESS;
617}
618
619
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200620#define QUEUE_STR "Packet queue options\n"
621#define LIFETIME_STR "Set lifetime limit of LLC frame in centi-seconds " \
622 "(overrides the value given by SGSN)\n"
623
Philipp Maier9459ebd2020-09-29 23:31:33 +0200624DEFUN_USRATTR(cfg_pcu_queue_lifetime,
625 cfg_pcu_queue_lifetime_cmd,
626 X(PCU_VTY_ATTR_NEW_TBF),
627 "queue lifetime <1-65534>",
628 QUEUE_STR LIFETIME_STR "Lifetime in centi-seconds")
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200629{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200630 struct gprs_rlcmac_bts *bts = bts_main_data();
Jacob Erlbeck2acfbeb2015-04-30 17:55:16 +0200631 uint16_t csec = atoi(argv[0]);
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200632
633 bts->force_llc_lifetime = csec;
634
635 return CMD_SUCCESS;
636}
637
Philipp Maier9459ebd2020-09-29 23:31:33 +0200638DEFUN_USRATTR(cfg_pcu_queue_lifetime_inf,
639 cfg_pcu_queue_lifetime_inf_cmd,
640 X(PCU_VTY_ATTR_NEW_TBF),
641 "queue lifetime infinite",
642 QUEUE_STR LIFETIME_STR "Infinite lifetime")
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200643{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200644 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200645
646 bts->force_llc_lifetime = 0xffff;
647
648 return CMD_SUCCESS;
649}
650
Philipp Maier9459ebd2020-09-29 23:31:33 +0200651DEFUN_USRATTR(cfg_pcu_no_queue_lifetime,
652 cfg_pcu_no_queue_lifetime_cmd,
653 X(PCU_VTY_ATTR_NEW_TBF),
654 "no queue lifetime",
655 NO_STR QUEUE_STR "Disable lifetime limit of LLC frame (use value given "
656 "by SGSN)\n")
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200657{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200658 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200659
660 bts->force_llc_lifetime = 0;
661
662 return CMD_SUCCESS;
663}
664
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100665#define QUEUE_HYSTERESIS_STR "Set lifetime hysteresis of LLC frame in centi-seconds " \
666 "(continue discarding until lifetime-hysteresis is reached)\n"
667
Philipp Maier9459ebd2020-09-29 23:31:33 +0200668DEFUN_USRATTR(cfg_pcu_queue_hysteresis,
669 cfg_pcu_queue_hysteresis_cmd,
670 X(PCU_VTY_ATTR_NEW_TBF),
671 "queue hysteresis <1-65535>",
672 QUEUE_STR QUEUE_HYSTERESIS_STR "Hysteresis in centi-seconds")
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100673{
674 struct gprs_rlcmac_bts *bts = bts_main_data();
Jacob Erlbeck2acfbeb2015-04-30 17:55:16 +0200675 uint16_t csec = atoi(argv[0]);
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100676
677 bts->llc_discard_csec = csec;
678
679 return CMD_SUCCESS;
680}
681
Philipp Maier9459ebd2020-09-29 23:31:33 +0200682DEFUN_USRATTR(cfg_pcu_no_queue_hysteresis,
683 cfg_pcu_no_queue_hysteresis_cmd,
684 X(PCU_VTY_ATTR_NEW_TBF),
685 "no queue hysteresis",
686 NO_STR QUEUE_STR QUEUE_HYSTERESIS_STR)
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100687{
688 struct gprs_rlcmac_bts *bts = bts_main_data();
689
690 bts->llc_discard_csec = 0;
691
692 return CMD_SUCCESS;
693}
694
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200695#define QUEUE_CODEL_STR "Set CoDel queue management\n"
Philipp Maier9459ebd2020-09-29 23:31:33 +0200696DEFUN_USRATTR(cfg_pcu_queue_codel,
697 cfg_pcu_queue_codel_cmd,
698 X(PCU_VTY_ATTR_NEW_SUBSCR),
699 "queue codel",
700 QUEUE_STR QUEUE_CODEL_STR)
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200701{
702 struct gprs_rlcmac_bts *bts = bts_main_data();
703
704 bts->llc_codel_interval_msec = LLC_CODEL_USE_DEFAULT;
705
706 return CMD_SUCCESS;
707}
708
Philipp Maier9459ebd2020-09-29 23:31:33 +0200709DEFUN_USRATTR(cfg_pcu_queue_codel_interval,
710 cfg_pcu_queue_codel_interval_cmd,
711 X(PCU_VTY_ATTR_NEW_SUBSCR),
712 "queue codel interval <1-1000>",
713 QUEUE_STR QUEUE_CODEL_STR "Specify interval\n" "Interval in centi-seconds")
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200714{
715 struct gprs_rlcmac_bts *bts = bts_main_data();
716 uint16_t csec = atoi(argv[0]);
717
718 bts->llc_codel_interval_msec = 10*csec;
719
720 return CMD_SUCCESS;
721}
722
Philipp Maier9459ebd2020-09-29 23:31:33 +0200723DEFUN_USRATTR(cfg_pcu_no_queue_codel,
724 cfg_pcu_no_queue_codel_cmd,
725 X(PCU_VTY_ATTR_NEW_SUBSCR),
726 "no queue codel",
727 NO_STR QUEUE_STR QUEUE_CODEL_STR)
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200728{
729 struct gprs_rlcmac_bts *bts = bts_main_data();
730
731 bts->llc_codel_interval_msec = LLC_CODEL_DISABLE;
732
733 return CMD_SUCCESS;
734}
735
736
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200737#define QUEUE_IDLE_ACK_STR "Request an ACK after the last DL LLC frame in centi-seconds\n"
738
Philipp Maier9459ebd2020-09-29 23:31:33 +0200739DEFUN_ATTR(cfg_pcu_queue_idle_ack_delay,
740 cfg_pcu_queue_idle_ack_delay_cmd,
741 "queue idle-ack-delay <1-65535>",
742 QUEUE_STR QUEUE_IDLE_ACK_STR "Idle ACK delay in centi-seconds",
743 CMD_ATTR_IMMEDIATE)
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200744{
745 struct gprs_rlcmac_bts *bts = bts_main_data();
Jacob Erlbeck2acfbeb2015-04-30 17:55:16 +0200746 uint16_t csec = atoi(argv[0]);
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200747
748 bts->llc_idle_ack_csec = csec;
749
750 return CMD_SUCCESS;
751}
752
Philipp Maier9459ebd2020-09-29 23:31:33 +0200753DEFUN_ATTR(cfg_pcu_no_queue_idle_ack_delay,
754 cfg_pcu_no_queue_idle_ack_delay_cmd,
755 "no queue idle-ack-delay",
756 NO_STR QUEUE_STR QUEUE_IDLE_ACK_STR,
757 CMD_ATTR_IMMEDIATE)
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200758{
759 struct gprs_rlcmac_bts *bts = bts_main_data();
760
761 bts->llc_idle_ack_csec = 0;
762
763 return CMD_SUCCESS;
764}
765
Philipp Maier9459ebd2020-09-29 23:31:33 +0200766DEFUN_ATTR(cfg_pcu_alloc,
767 cfg_pcu_alloc_cmd,
768 "alloc-algorithm (a|b|dynamic)",
769 "Select slot allocation algorithm to use when assigning timeslots on "
770 "PACCH\n"
771 "Single slot is assigned only\n"
772 "Multiple slots are assigned for semi-duplex operation\n"
773 "Dynamically select the algorithm based on the system state\n",
774 CMD_ATTR_IMMEDIATE)
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200775{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200776 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200777
778 switch (argv[0][0]) {
779 case 'a':
780 bts->alloc_algorithm = alloc_algorithm_a;
781 break;
782 case 'b':
783 bts->alloc_algorithm = alloc_algorithm_b;
784 break;
Jacob Erlbeck400ec022015-07-14 13:31:48 +0200785 default:
786 bts->alloc_algorithm = alloc_algorithm_dynamic;
787 break;
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200788 }
789
790 return CMD_SUCCESS;
791}
792
Philipp Maier9459ebd2020-09-29 23:31:33 +0200793DEFUN_ATTR(cfg_pcu_two_phase,
794 cfg_pcu_two_phase_cmd,
795 "two-phase-access",
796 "Force two phase access when MS requests single phase access\n",
797 CMD_ATTR_IMMEDIATE)
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200798{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200799 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200800
801 bts->force_two_phase = 1;
802
803 return CMD_SUCCESS;
804}
805
Philipp Maier9459ebd2020-09-29 23:31:33 +0200806DEFUN_ATTR(cfg_pcu_no_two_phase,
807 cfg_pcu_no_two_phase_cmd,
808 "no two-phase-access",
809 NO_STR "Only use two phase access when requested my MS\n",
810 CMD_ATTR_IMMEDIATE)
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200811{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200812 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200813
814 bts->force_two_phase = 0;
815
816 return CMD_SUCCESS;
817}
818
Philipp Maier9459ebd2020-09-29 23:31:33 +0200819DEFUN_ATTR(cfg_pcu_alpha,
820 cfg_pcu_alpha_cmd,
821 "alpha <0-10>",
822 "Alpha parameter for MS power control in units of 0.1 (see TS 05.08) "
823 "NOTE: Be sure to set Alpha value at System information 13 too.\n"
824 "Alpha in units of 0.1\n",
825 CMD_ATTR_IMMEDIATE)
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200826{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200827 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200828
829 bts->alpha = atoi(argv[0]);
830
831 return CMD_SUCCESS;
832}
833
Philipp Maier9459ebd2020-09-29 23:31:33 +0200834DEFUN_ATTR(cfg_pcu_gamma,
835 cfg_pcu_gamma_cmd,
836 "gamma <0-62>",
837 "Gamma parameter for MS power control in units of dB (see TS 05.08)\n"
838 "Gamma in even unit of dBs\n",
839 CMD_ATTR_IMMEDIATE)
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200840{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200841 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200842
843 bts->gamma = atoi(argv[0]) / 2;
844
845 return CMD_SUCCESS;
846}
847
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +0100848DEFUN(show_bts_stats,
849 show_bts_stats_cmd,
850 "show bts statistics",
851 SHOW_STR "BTS related functionality\nStatistics\n")
852{
853 vty_out_rate_ctr_group(vty, "", bts_main_data_stats());
854 return CMD_SUCCESS;
Daniel Willmann772415f2014-01-15 17:06:51 +0100855}
856
Pau Espin Pedrola1ac2f02020-09-22 17:01:31 +0200857DEFUN(show_bts_pdch,
858 show_bts_pdch_cmd,
859 "show bts pdch",
860 SHOW_STR "BTS related functionality\nPDCH timeslots\n")
861{
862 return pcu_vty_show_bts_pdch(vty, bts_main_data());
863}
864
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100865#define IDLE_TIME_STR "keep an idle DL TBF alive for the time given\n"
Pau Espin Pedrol2b5c6292019-09-09 13:41:00 +0200866DEFUN_DEPRECATED(cfg_pcu_dl_tbf_idle_time,
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100867 cfg_pcu_dl_tbf_idle_time_cmd,
868 "dl-tbf-idle-time <1-5000>",
869 IDLE_TIME_STR "idle time in msec")
870{
Pau Espin Pedrol2b5c6292019-09-09 13:41:00 +0200871 vty_out(vty, "%% 'dl-tbf-idle-time' is now deprecated: use 'timer X2031 <val>' instead%s", VTY_NEWLINE);
872
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100873 struct gprs_rlcmac_bts *bts = bts_main_data();
874
Pau Espin Pedrol2b5c6292019-09-09 13:41:00 +0200875 if (osmo_tdef_set(bts->T_defs_pcu, -2031, atoi(argv[0]), OSMO_TDEF_MS) < 0)
876 return CMD_WARNING;
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100877 return CMD_SUCCESS;
878}
879
Pau Espin Pedrol2b5c6292019-09-09 13:41:00 +0200880DEFUN_DEPRECATED(cfg_pcu_no_dl_tbf_idle_time,
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100881 cfg_pcu_no_dl_tbf_idle_time_cmd,
882 "no dl-tbf-idle-time",
883 NO_STR IDLE_TIME_STR)
884{
Pau Espin Pedrol2b5c6292019-09-09 13:41:00 +0200885 vty_out(vty, "%% 'no dl-tbf-idle-time' is now deprecated: use 'timer X2031 0' instead%s", VTY_NEWLINE);
886
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100887 struct gprs_rlcmac_bts *bts = bts_main_data();
888
Pau Espin Pedrol2b5c6292019-09-09 13:41:00 +0200889 if (osmo_tdef_set(bts->T_defs_pcu, -2031, 0, OSMO_TDEF_MS) < 0)
890 return CMD_WARNING;
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100891 return CMD_SUCCESS;
892}
893
Oliver Smith45fdc442019-09-05 15:12:20 +0200894#define RETRANSMISSION_STR "retransmit blocks even before the MS had a chance to receive them (better throughput," \
895 " less readable traces)"
Philipp Maier9459ebd2020-09-29 23:31:33 +0200896DEFUN_ATTR(cfg_pcu_dl_tbf_preemptive_retransmission,
897 cfg_pcu_dl_tbf_preemptive_retransmission_cmd,
898 "dl-tbf-preemptive-retransmission",
899 RETRANSMISSION_STR " (enabled by default)",
900 CMD_ATTR_IMMEDIATE)
Oliver Smith45fdc442019-09-05 15:12:20 +0200901{
902 struct gprs_rlcmac_bts *bts = bts_main_data();
903
904 bts->dl_tbf_preemptive_retransmission = true;
905
906 return CMD_SUCCESS;
907}
908
Philipp Maier9459ebd2020-09-29 23:31:33 +0200909DEFUN_ATTR(cfg_pcu_no_dl_tbf_preemptive_retransmission,
910 cfg_pcu_no_dl_tbf_preemptive_retransmission_cmd,
911 "no dl-tbf-preemptive-retransmission",
912 NO_STR RETRANSMISSION_STR,
913 CMD_ATTR_IMMEDIATE)
Oliver Smith45fdc442019-09-05 15:12:20 +0200914{
915 struct gprs_rlcmac_bts *bts = bts_main_data();
916
917 bts->dl_tbf_preemptive_retransmission = false;
918
919 return CMD_SUCCESS;
920}
921
Jacob Erlbecka098c192015-05-28 16:11:19 +0200922#define MS_IDLE_TIME_STR "keep an idle MS object alive for the time given\n"
Pau Espin Pedrol63700ea2019-09-09 13:19:06 +0200923DEFUN_DEPRECATED(cfg_pcu_ms_idle_time,
Jacob Erlbecka098c192015-05-28 16:11:19 +0200924 cfg_pcu_ms_idle_time_cmd,
925 "ms-idle-time <1-7200>",
926 MS_IDLE_TIME_STR "idle time in sec")
927{
Pau Espin Pedrol63700ea2019-09-09 13:19:06 +0200928 vty_out(vty, "%% 'ms-idle-time' is now deprecated: use 'timer X2030 <val>' instead%s", VTY_NEWLINE);
929
Jacob Erlbecka098c192015-05-28 16:11:19 +0200930 struct gprs_rlcmac_bts *bts = bts_main_data();
931
Pau Espin Pedrol63700ea2019-09-09 13:19:06 +0200932 if (osmo_tdef_set(bts->T_defs_pcu, -2030, atoi(argv[0]), OSMO_TDEF_S) < 0)
933 return CMD_WARNING;
Jacob Erlbecka098c192015-05-28 16:11:19 +0200934 return CMD_SUCCESS;
935}
936
Pau Espin Pedrol63700ea2019-09-09 13:19:06 +0200937DEFUN_DEPRECATED(cfg_pcu_no_ms_idle_time,
Jacob Erlbecka098c192015-05-28 16:11:19 +0200938 cfg_pcu_no_ms_idle_time_cmd,
939 "no ms-idle-time",
940 NO_STR MS_IDLE_TIME_STR)
941{
Pau Espin Pedrol63700ea2019-09-09 13:19:06 +0200942 vty_out(vty, "%% 'no ms-idle-time' is now deprecated: use 'timer X2030 0' instead%s", VTY_NEWLINE);
943
Jacob Erlbecka098c192015-05-28 16:11:19 +0200944 struct gprs_rlcmac_bts *bts = bts_main_data();
945
Pau Espin Pedrol63700ea2019-09-09 13:19:06 +0200946 if (osmo_tdef_set(bts->T_defs_pcu, -2030, 0, OSMO_TDEF_S) < 0)
947 return CMD_WARNING;
Jacob Erlbecka098c192015-05-28 16:11:19 +0200948 return CMD_SUCCESS;
949}
950
Pau Espin Pedrol1e6eb302019-11-28 17:00:44 +0100951#define CS_ERR_LIMITS_STR "set thresholds for error rate based downlink (M)CS adjustment\n"
Philipp Maier9459ebd2020-09-29 23:31:33 +0200952DEFUN_ATTR(cfg_pcu_cs_err_limits,
953 cfg_pcu_cs_err_limits_cmd,
954 "cs threshold <0-100> <0-100>",
955 CS_STR CS_ERR_LIMITS_STR "lower limit in %\n" "upper limit in %\n",
956 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200957{
958 struct gprs_rlcmac_bts *bts = bts_main_data();
959
960 uint8_t lower_limit = atoi(argv[0]);
961 uint8_t upper_limit = atoi(argv[1]);
962
963 if (lower_limit > upper_limit) {
964 vty_out(vty,
965 "The lower limit must be less than or equal to the "
966 "upper limit.%s", VTY_NEWLINE);
967 return CMD_WARNING;
968 }
969
970 bts->cs_adj_enabled = 1;
971 bts->cs_adj_upper_limit = upper_limit;
972 bts->cs_adj_lower_limit = lower_limit;
973
974 return CMD_SUCCESS;
975}
976
Philipp Maier9459ebd2020-09-29 23:31:33 +0200977DEFUN_ATTR(cfg_pcu_no_cs_err_limits,
978 cfg_pcu_no_cs_err_limits_cmd,
979 "no cs threshold",
980 NO_STR CS_STR CS_ERR_LIMITS_STR,
981 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200982{
983 struct gprs_rlcmac_bts *bts = bts_main_data();
984
985 bts->cs_adj_enabled = 0;
986 bts->cs_adj_upper_limit = 100;
987 bts->cs_adj_lower_limit = 0;
988
989 return CMD_SUCCESS;
990}
991
Pau Espin Pedrol1e6eb302019-11-28 17:00:44 +0100992#define CS_DOWNGRADE_STR "set threshold for data size based downlink (M)CS downgrade\n"
Philipp Maier9459ebd2020-09-29 23:31:33 +0200993DEFUN_ATTR(cfg_pcu_cs_downgrade_thrsh,
994 cfg_pcu_cs_downgrade_thrsh_cmd,
995 "cs downgrade-threshold <1-10000>",
996 CS_STR CS_DOWNGRADE_STR "downgrade if less octets left\n",
997 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +0200998{
999 struct gprs_rlcmac_bts *bts = bts_main_data();
1000
1001 bts->cs_downgrade_threshold = atoi(argv[0]);
1002
1003 return CMD_SUCCESS;
1004}
1005
Philipp Maier9459ebd2020-09-29 23:31:33 +02001006DEFUN_ATTR(cfg_pcu_no_cs_downgrade_thrsh,
1007 cfg_pcu_no_cs_downgrade_thrsh_cmd,
1008 "no cs downgrade-threshold",
1009 NO_STR CS_STR CS_DOWNGRADE_STR,
1010 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +02001011{
1012 struct gprs_rlcmac_bts *bts = bts_main_data();
1013
1014 bts->cs_downgrade_threshold = 0;
1015
1016 return CMD_SUCCESS;
1017}
1018
Philipp Maier9459ebd2020-09-29 23:31:33 +02001019DEFUN_ATTR(cfg_pcu_cs_lqual_ranges,
1020 cfg_pcu_cs_lqual_ranges_cmd,
1021 "cs link-quality-ranges cs1 <0-35> cs2 <0-35> <0-35> cs3 <0-35> <0-35> cs4 <0-35>",
1022 CS_STR "Set link quality ranges for each uplink CS\n"
1023 "Set quality range for CS-1 (high value only)\n"
1024 "CS-1 high (dB)\n"
1025 "Set quality range for CS-2\n"
1026 "CS-2 low (dB)\n"
1027 "CS-2 high (dB)\n"
1028 "Set quality range for CS-3\n"
1029 "CS-3 low (dB)\n"
1030 "CS-3 high (dB)\n"
1031 "Set quality range for CS-4 (low value only)\n"
1032 "CS-4 low (dB)\n",
1033 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck94cde132015-06-09 09:44:36 +02001034{
1035 struct gprs_rlcmac_bts *bts = bts_main_data();
1036
1037 uint8_t cs1_high = atoi(argv[0]);
1038 uint8_t cs2_low = atoi(argv[1]);
1039 uint8_t cs2_high = atoi(argv[2]);
1040 uint8_t cs3_low = atoi(argv[3]);
1041 uint8_t cs3_high = atoi(argv[4]);
1042 uint8_t cs4_low = atoi(argv[5]);
1043
1044 bts->cs_lqual_ranges[0].high = cs1_high;
1045 bts->cs_lqual_ranges[1].low = cs2_low;
1046 bts->cs_lqual_ranges[1].high = cs2_high;
1047 bts->cs_lqual_ranges[2].low = cs3_low;
1048 bts->cs_lqual_ranges[2].high = cs3_high;
1049 bts->cs_lqual_ranges[3].low = cs4_low;
1050
1051 return CMD_SUCCESS;
1052}
1053
Philipp Maier9459ebd2020-09-29 23:31:33 +02001054DEFUN_ATTR(cfg_pcu_mcs_lqual_ranges,
1055 cfg_pcu_mcs_lqual_ranges_cmd,
1056 "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>",
1057 CS_STR "Set link quality ranges for each uplink MCS\n"
1058 "Set quality range for MCS-1 (high value only)\n"
1059 "MCS-1 high (dB)\n"
1060 "Set quality range for MCS-2\n"
1061 "MCS-2 high (dB)\n"
1062 "MCS-2 low (dB)\n"
1063 "Set quality range for MCS-3\n"
1064 "MCS-3 high (dB)\n"
1065 "MCS-3 low (dB)\n"
1066 "Set quality range for MCS-4\n"
1067 "MCS-4 high (dB)\n"
1068 "MCS-4 low (dB)\n"
1069 "Set quality range for MCS-5\n"
1070 "MCS-5 high (dB)\n"
1071 "MCS-5 low (dB)\n"
1072 "Set quality range for MCS-6\n"
1073 "MCS-6 low (dB)\n"
1074 "MCS-6 high (dB)\n"
1075 "Set quality range for MCS-7\n"
1076 "MCS-7 low (dB)\n"
1077 "MCS-7 high (dB)\n"
1078 "Set quality range for MCS-8\n"
1079 "MCS-8 low (dB)\n"
1080 "MCS-8 high (dB)\n"
1081 "Set quality range for MCS-9 (low value only)\n"
1082 "MCS-9 low (dB)\n",
1083 CMD_ATTR_IMMEDIATE)
Minh-Quang Nguyen1f189092017-08-16 09:50:06 -04001084{
1085 struct gprs_rlcmac_bts *bts = bts_main_data();
1086
1087 bts->mcs_lqual_ranges[0].high = atoi(argv[0]);
1088 bts->mcs_lqual_ranges[1].low = atoi(argv[1]);
1089 bts->mcs_lqual_ranges[1].high = atoi(argv[2]);
1090 bts->mcs_lqual_ranges[2].low = atoi(argv[3]);
1091 bts->mcs_lqual_ranges[2].high = atoi(argv[4]);
1092 bts->mcs_lqual_ranges[3].low = atoi(argv[5]);
1093 bts->mcs_lqual_ranges[3].high = atoi(argv[6]);
1094 bts->mcs_lqual_ranges[4].low = atoi(argv[7]);
1095 bts->mcs_lqual_ranges[4].high = atoi(argv[8]);
1096 bts->mcs_lqual_ranges[5].low = atoi(argv[9]);
1097 bts->mcs_lqual_ranges[5].high = atoi(argv[10]);
1098 bts->mcs_lqual_ranges[6].low = atoi(argv[11]);
1099 bts->mcs_lqual_ranges[6].high = atoi(argv[12]);
1100 bts->mcs_lqual_ranges[7].low = atoi(argv[13]);
1101 bts->mcs_lqual_ranges[7].high = atoi(argv[14]);
1102 bts->mcs_lqual_ranges[8].low = atoi(argv[15]);
1103
1104 return CMD_SUCCESS;
1105}
1106
Pau Espin Pedrolc4178e52017-08-08 15:03:50 +02001107DEFUN(cfg_pcu_sock,
1108 cfg_pcu_sock_cmd,
1109 "pcu-socket PATH",
1110 "Configure the osmo-bts PCU socket file/path name\n"
1111 "Path of the socket to connect to\n")
1112{
1113 struct gprs_rlcmac_bts *bts = bts_main_data();
1114
Vadim Yanitskiyfc75cc02019-11-30 20:13:25 +07001115 if (vty->type != VTY_FILE)
1116 vty_out(vty, "Changing PCU socket path at run-time has no effect%s", VTY_NEWLINE);
1117
Vadim Yanitskiy657a4c02019-11-30 20:15:22 +07001118 osmo_talloc_replace_string(tall_pcu_ctx, &bts->pcu_sock_path, argv[0]);
Pau Espin Pedrolc4178e52017-08-08 15:03:50 +02001119
1120 return CMD_SUCCESS;
1121}
Jacob Erlbeck94cde132015-06-09 09:44:36 +02001122
Philipp Maier9459ebd2020-09-29 23:31:33 +02001123DEFUN_USRATTR(cfg_pcu_gb_dialect,
1124 cfg_pcu_gb_dialect_cmd,
1125 X(PCU_VTY_ATTR_NS_RESET),
1126 "gb-dialect (classic|ip-sns)",
1127 "Select which Gb interface dialect to use\n"
1128 "Classic Gb interface with NS-{RESET,BLOCK,UNBLOCK} and static configuration\n"
1129 "Modern Gb interface with IP-SNS (Sub Network Service) and dynamic configuration\n")
Harald Welte57d35152018-07-05 03:11:17 +02001130{
1131 struct gprs_rlcmac_bts *bts = bts_main_data();
1132
Alexander Couzens290d9032020-09-16 21:52:02 +02001133 if (!strcmp(argv[0], "ip-sns")) {
Harald Welte57d35152018-07-05 03:11:17 +02001134 bts->gb_dialect_sns = true;
Alexander Couzens290d9032020-09-16 21:52:02 +02001135 gprs_ns2_vty_force_vc_mode(true, NS2_VC_MODE_ALIVE, "gb-dialect is ip-sns");
1136 } else {
Harald Welte57d35152018-07-05 03:11:17 +02001137 bts->gb_dialect_sns = false;
Alexander Couzens290d9032020-09-16 21:52:02 +02001138 gprs_ns2_vty_force_vc_mode(false, 0, NULL);
1139 }
Harald Welte57d35152018-07-05 03:11:17 +02001140
1141 return CMD_SUCCESS;
1142}
1143
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +02001144DEFUN(show_bts_timer, show_bts_timer_cmd,
1145 "show bts-timer " OSMO_TDEF_VTY_ARG_T_OPTIONAL,
1146 SHOW_STR "Show BTS controlled timers\n"
1147 OSMO_TDEF_VTY_DOC_T)
1148{
1149 struct gprs_rlcmac_bts *bts = bts_main_data();
1150 const char *T_arg = argc > 0 ? argv[0] : NULL;
1151 return osmo_tdef_vty_show_cmd(vty, bts->T_defs_bts, T_arg, NULL);
1152}
1153
1154DEFUN(show_timer, show_timer_cmd,
1155 "show timer " OSMO_TDEF_VTY_ARG_T_OPTIONAL,
1156 SHOW_STR "Show PCU timers\n"
1157 OSMO_TDEF_VTY_DOC_T)
1158{
1159 struct gprs_rlcmac_bts *bts = bts_main_data();
1160 const char *T_arg = argc > 0 ? argv[0] : NULL;
1161 return osmo_tdef_vty_show_cmd(vty, bts->T_defs_pcu, T_arg, NULL);
1162}
1163
Philipp Maier9459ebd2020-09-29 23:31:33 +02001164DEFUN_ATTR(cfg_pcu_timer, cfg_pcu_timer_cmd,
1165 "timer " OSMO_TDEF_VTY_ARG_SET_OPTIONAL,
1166 "Configure or show PCU timers\n"
1167 OSMO_TDEF_VTY_DOC_SET,
1168 CMD_ATTR_IMMEDIATE)
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +02001169{
1170 struct gprs_rlcmac_bts *bts = bts_main_data();
1171 /* If any arguments are missing, redirect to 'show' */
1172 if (argc < 2)
1173 return show_timer(self, vty, argc, argv);
1174 return osmo_tdef_vty_set_cmd(vty, bts->T_defs_pcu, argv);
1175}
1176
Daniel Willmann772415f2014-01-15 17:06:51 +01001177DEFUN(show_tbf,
1178 show_tbf_cmd,
Max12a09872018-02-01 16:07:33 +01001179 "show tbf (all|ccch|pacch)",
1180 SHOW_STR "information about TBFs\n"
1181 "All TBFs\n"
1182 "TBFs allocated via CCCH\n"
1183 "TBFs allocated via PACCH\n")
Daniel Willmann772415f2014-01-15 17:06:51 +01001184{
1185 struct gprs_rlcmac_bts *bts = bts_main_data();
Vadim Yanitskiycef2f842019-10-09 21:52:50 +07001186 uint32_t flags = UINT32_MAX;
Max12a09872018-02-01 16:07:33 +01001187
Vadim Yanitskiycef2f842019-10-09 21:52:50 +07001188 if (argv[0][0] == 'c')
1189 flags = (1 << GPRS_RLCMAC_FLAG_CCCH);
1190 else if (argv[0][0] == 'p')
1191 flags = (1 << GPRS_RLCMAC_FLAG_PACCH);
Max12a09872018-02-01 16:07:33 +01001192
Vadim Yanitskiycef2f842019-10-09 21:52:50 +07001193 return pcu_vty_show_tbf_all(vty, bts, flags);
Daniel Willmann772415f2014-01-15 17:06:51 +01001194}
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +01001195
Jacob Erlbeckf47f68a2015-06-04 10:23:24 +02001196DEFUN(show_ms_all,
1197 show_ms_all_cmd,
1198 "show ms all",
1199 SHOW_STR "information about MSs\n" "All TBFs\n")
1200{
1201 struct gprs_rlcmac_bts *bts = bts_main_data();
1202 return pcu_vty_show_ms_all(vty, bts);
1203}
1204
Jacob Erlbeck37e896d2015-06-05 16:33:33 +02001205DEFUN(show_ms_tlli,
1206 show_ms_tlli_cmd,
1207 "show ms tlli TLLI",
1208 SHOW_STR "information about MSs\n" "Select MS by TLLI\n" "TLLI as hex\n")
1209{
1210 struct gprs_rlcmac_bts *bts = bts_main_data();
1211 char *endp = NULL;
1212 unsigned long long tlli = strtoll(argv[0], &endp, 16);
1213 if ((endp != NULL && *endp != 0) || tlli > 0xffffffffULL) {
1214 vty_out(vty, "Invalid TLLI.%s", VTY_NEWLINE);
1215 return CMD_WARNING;
1216 }
1217 return pcu_vty_show_ms_by_tlli(vty, bts, (uint32_t)tlli);
1218}
1219
1220DEFUN(show_ms_imsi,
1221 show_ms_imsi_cmd,
1222 "show ms imsi IMSI",
1223 SHOW_STR "information about MSs\n" "Select MS by IMSI\n" "IMSI\n")
1224{
1225 struct gprs_rlcmac_bts *bts = bts_main_data();
1226 return pcu_vty_show_ms_by_imsi(vty, bts, argv[0]);
1227}
1228
Andreas Eversberg12942562012-07-12 14:31:57 +02001229static const char pcu_copyright[] =
Harald Welted1e340f2013-01-17 12:24:29 +01001230 "Copyright (C) 2012 by Ivan Kluchnikov <kluchnikovi@gmail.com> and \r\n"
1231 " Andreas Eversberg <jolly@eversberg.eu>\r\n"
Andreas Eversberg12942562012-07-12 14:31:57 +02001232 "License GNU GPL version 2 or later\r\n"
1233 "This is free software: you are free to change and redistribute it.\r\n"
1234 "There is NO WARRANTY, to the extent permitted by law.\r\n";
1235
1236struct vty_app_info pcu_vty_info = {
Pau Espin Pedrold0fc9e82019-11-29 13:37:45 +01001237 .name = "OsmoPCU",
Andreas Eversberg12942562012-07-12 14:31:57 +02001238 .version = PACKAGE_VERSION,
1239 .copyright = pcu_copyright,
Philipp Maier9459ebd2020-09-29 23:31:33 +02001240 .usr_attr_desc = {
1241 [PCU_VTY_ATTR_NEW_TBF] = \
1242 "This command applies when a new TBF is begins",
1243 [PCU_VTY_ATTR_NEW_SUBSCR] = \
1244 "This command applies when a new subscriber attaches",
1245 [PCU_VTY_ATTR_NS_RESET] = \
1246 "This command applies when the NS is reset",
1247 },
1248 .usr_attr_letters = {
1249 [PCU_VTY_ATTR_NEW_TBF] = 'n',
1250 [PCU_VTY_ATTR_NEW_SUBSCR] = 's',
1251 [PCU_VTY_ATTR_NS_RESET] = 'r',
1252 },
Andreas Eversberg12942562012-07-12 14:31:57 +02001253};
1254
Pau Espin Pedrolcd2ac562019-08-05 14:30:44 +02001255int pcu_vty_init(void)
Andreas Eversberg12942562012-07-12 14:31:57 +02001256{
1257// install_element_ve(&show_pcu_cmd);
1258
Harald Welte717cdf52017-07-21 21:56:23 +02001259 cfg_pcu_gsmtap_categ_cmd.string = vty_cmd_string_from_valstr(tall_pcu_ctx, pcu_gsmtap_categ_names,
1260 "gsmtap-category (",
1261 "|",")", VTY_DO_LOWER);
1262 cfg_pcu_gsmtap_categ_cmd.doc = vty_cmd_string_from_valstr(tall_pcu_ctx, pcu_gsmtap_categ_help,
1263 "GSMTAP Category\n",
1264 "\n", "", 0);
1265 cfg_pcu_no_gsmtap_categ_cmd.string = vty_cmd_string_from_valstr(tall_pcu_ctx, pcu_gsmtap_categ_names,
1266 "no gsmtap-category (",
1267 "|",")", VTY_DO_LOWER);
1268 cfg_pcu_no_gsmtap_categ_cmd.doc = vty_cmd_string_from_valstr(tall_pcu_ctx, pcu_gsmtap_categ_help,
1269 NO_STR "GSMTAP Category\n",
1270 "\n", "", 0);
1271
Pau Espin Pedrolcd2ac562019-08-05 14:30:44 +02001272 logging_vty_add_cmds();
1273 osmo_stats_vty_add_cmds();
Vadim Yanitskiyd83c8ff2020-02-06 16:46:17 +07001274 osmo_talloc_vty_add_cmds();
Andreas Eversberg12942562012-07-12 14:31:57 +02001275
Andreas Eversberg8b761a32012-07-20 21:50:31 +02001276 install_node(&pcu_node, config_write_pcu);
1277 install_element(CONFIG_NODE, &cfg_pcu_cmd);
Jacob Erlbeck953c7892015-09-28 18:12:57 +02001278 install_element(PCU_NODE, &cfg_pcu_egprs_cmd);
1279 install_element(PCU_NODE, &cfg_pcu_no_egprs_cmd);
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +02001280 install_element(PCU_NODE, &cfg_pcu_no_two_phase_cmd);
Andreas Eversberg8b761a32012-07-20 21:50:31 +02001281 install_element(PCU_NODE, &cfg_pcu_cs_cmd);
1282 install_element(PCU_NODE, &cfg_pcu_no_cs_cmd);
Jacob Erlbeckb33e6752015-06-04 19:04:30 +02001283 install_element(PCU_NODE, &cfg_pcu_cs_max_cmd);
1284 install_element(PCU_NODE, &cfg_pcu_no_cs_max_cmd);
Jacob Erlbeck8322d082015-06-04 15:12:10 +02001285 install_element(PCU_NODE, &cfg_pcu_cs_err_limits_cmd);
1286 install_element(PCU_NODE, &cfg_pcu_no_cs_err_limits_cmd);
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +02001287 install_element(PCU_NODE, &cfg_pcu_cs_downgrade_thrsh_cmd);
1288 install_element(PCU_NODE, &cfg_pcu_no_cs_downgrade_thrsh_cmd);
Jacob Erlbeck94cde132015-06-09 09:44:36 +02001289 install_element(PCU_NODE, &cfg_pcu_cs_lqual_ranges_cmd);
Minh-Quang Nguyen1f189092017-08-16 09:50:06 -04001290 install_element(PCU_NODE, &cfg_pcu_mcs_lqual_ranges_cmd);
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +01001291 install_element(PCU_NODE, &cfg_pcu_mcs_cmd);
Aravind Sirsikar50b09702016-08-22 17:21:10 +05301292 install_element(PCU_NODE, &cfg_pcu_dl_arq_cmd);
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +01001293 install_element(PCU_NODE, &cfg_pcu_no_mcs_cmd);
Jacob Erlbeck0d058052016-01-07 11:48:28 +01001294 install_element(PCU_NODE, &cfg_pcu_mcs_max_cmd);
1295 install_element(PCU_NODE, &cfg_pcu_no_mcs_max_cmd);
Jacob Erlbeck36df7742016-01-19 15:53:30 +01001296 install_element(PCU_NODE, &cfg_pcu_window_size_cmd);
Andreas Eversberg24131bf2012-07-21 11:09:58 +02001297 install_element(PCU_NODE, &cfg_pcu_queue_lifetime_cmd);
1298 install_element(PCU_NODE, &cfg_pcu_queue_lifetime_inf_cmd);
1299 install_element(PCU_NODE, &cfg_pcu_no_queue_lifetime_cmd);
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +01001300 install_element(PCU_NODE, &cfg_pcu_queue_hysteresis_cmd);
1301 install_element(PCU_NODE, &cfg_pcu_no_queue_hysteresis_cmd);
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +02001302 install_element(PCU_NODE, &cfg_pcu_queue_codel_cmd);
1303 install_element(PCU_NODE, &cfg_pcu_queue_codel_interval_cmd);
1304 install_element(PCU_NODE, &cfg_pcu_no_queue_codel_cmd);
Jacob Erlbeckd0261b72015-04-02 13:58:09 +02001305 install_element(PCU_NODE, &cfg_pcu_queue_idle_ack_delay_cmd);
1306 install_element(PCU_NODE, &cfg_pcu_no_queue_idle_ack_delay_cmd);
Andreas Eversberga1503fa2012-07-22 08:58:09 +02001307 install_element(PCU_NODE, &cfg_pcu_alloc_cmd);
Andreas Eversberg07e97cf2012-08-07 16:00:56 +02001308 install_element(PCU_NODE, &cfg_pcu_two_phase_cmd);
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +02001309 install_element(PCU_NODE, &cfg_pcu_fc_interval_cmd);
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +02001310 install_element(PCU_NODE, &cfg_pcu_fc_bucket_time_cmd);
1311 install_element(PCU_NODE, &cfg_pcu_no_fc_bucket_time_cmd);
Jacob Erlbeck87d73412015-04-21 12:56:48 +02001312 install_element(PCU_NODE, &cfg_pcu_fc_bvc_bucket_size_cmd);
1313 install_element(PCU_NODE, &cfg_pcu_no_fc_bvc_bucket_size_cmd);
1314 install_element(PCU_NODE, &cfg_pcu_fc_bvc_leak_rate_cmd);
1315 install_element(PCU_NODE, &cfg_pcu_no_fc_bvc_leak_rate_cmd);
1316 install_element(PCU_NODE, &cfg_pcu_fc_ms_bucket_size_cmd);
1317 install_element(PCU_NODE, &cfg_pcu_no_fc_ms_bucket_size_cmd);
1318 install_element(PCU_NODE, &cfg_pcu_fc_ms_leak_rate_cmd);
1319 install_element(PCU_NODE, &cfg_pcu_no_fc_ms_leak_rate_cmd);
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +02001320 install_element(PCU_NODE, &cfg_pcu_alpha_cmd);
1321 install_element(PCU_NODE, &cfg_pcu_gamma_cmd);
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +01001322 install_element(PCU_NODE, &cfg_pcu_dl_tbf_idle_time_cmd);
1323 install_element(PCU_NODE, &cfg_pcu_no_dl_tbf_idle_time_cmd);
Oliver Smith45fdc442019-09-05 15:12:20 +02001324 install_element(PCU_NODE, &cfg_pcu_dl_tbf_preemptive_retransmission_cmd);
1325 install_element(PCU_NODE, &cfg_pcu_no_dl_tbf_preemptive_retransmission_cmd);
Jacob Erlbecka098c192015-05-28 16:11:19 +02001326 install_element(PCU_NODE, &cfg_pcu_ms_idle_time_cmd);
1327 install_element(PCU_NODE, &cfg_pcu_no_ms_idle_time_cmd);
Harald Welte717cdf52017-07-21 21:56:23 +02001328 install_element(PCU_NODE, &cfg_pcu_gsmtap_categ_cmd);
1329 install_element(PCU_NODE, &cfg_pcu_no_gsmtap_categ_cmd);
Pau Espin Pedrolc4178e52017-08-08 15:03:50 +02001330 install_element(PCU_NODE, &cfg_pcu_sock_cmd);
Harald Welte57d35152018-07-05 03:11:17 +02001331 install_element(PCU_NODE, &cfg_pcu_gb_dialect_cmd);
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +02001332 install_element(PCU_NODE, &cfg_pcu_timer_cmd);
Andreas Eversberg8b761a32012-07-20 21:50:31 +02001333
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +01001334 install_element_ve(&show_bts_stats_cmd);
Pau Espin Pedrola1ac2f02020-09-22 17:01:31 +02001335 install_element_ve(&show_bts_pdch_cmd);
Daniel Willmann772415f2014-01-15 17:06:51 +01001336 install_element_ve(&show_tbf_cmd);
Jacob Erlbeckf47f68a2015-06-04 10:23:24 +02001337 install_element_ve(&show_ms_all_cmd);
Jacob Erlbeck37e896d2015-06-05 16:33:33 +02001338 install_element_ve(&show_ms_tlli_cmd);
1339 install_element_ve(&show_ms_imsi_cmd);
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +02001340 install_element_ve(&show_bts_timer_cmd);
1341 install_element_ve(&show_timer_cmd);
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +01001342
Andreas Eversberg12942562012-07-12 14:31:57 +02001343 return 0;
1344}