blob: bd835446fc04637f09bcb762b07b71d23eb4d5a7 [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);
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200111 if (bts->egprs_enabled)
Jacob Erlbeck9b3d7e02016-01-19 10:44:42 +0100112 vty_out(vty, " egprs only%s", VTY_NEWLINE);
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200113
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200114 vty_out(vty, " flow-control-interval %d%s", bts->fc_interval,
115 VTY_NEWLINE);
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200116 if (bts->fc_bvc_bucket_size)
117 vty_out(vty, " flow-control force-bvc-bucket-size %d%s",
118 bts->fc_bvc_bucket_size, VTY_NEWLINE);
119 if (bts->fc_bvc_leak_rate)
120 vty_out(vty, " flow-control force-bvc-leak-rate %d%s",
121 bts->fc_bvc_leak_rate, VTY_NEWLINE);
122 if (bts->fc_ms_bucket_size)
123 vty_out(vty, " flow-control force-ms-bucket-size %d%s",
124 bts->fc_ms_bucket_size, VTY_NEWLINE);
125 if (bts->fc_ms_leak_rate)
126 vty_out(vty, " flow-control force-ms-leak-rate %d%s",
127 bts->fc_ms_leak_rate, VTY_NEWLINE);
Holger Hans Peter Freytherc421e8a2014-07-02 14:55:17 +0200128 if (bts->force_cs) {
Andreas Eversberg499ff412012-10-03 14:21:36 +0200129 if (bts->initial_cs_ul == bts->initial_cs_dl)
130 vty_out(vty, " cs %d%s", bts->initial_cs_dl,
131 VTY_NEWLINE);
132 else
133 vty_out(vty, " cs %d %d%s", bts->initial_cs_dl,
134 bts->initial_cs_ul, VTY_NEWLINE);
Holger Hans Peter Freytherc421e8a2014-07-02 14:55:17 +0200135 }
Pau Espin Pedrol343ec9b2020-10-30 18:35:54 +0100136 if (bts->vty.max_cs_dl && bts->vty.max_cs_ul) {
137 if (bts->vty.max_cs_ul == bts->vty.max_cs_dl)
138 vty_out(vty, " cs max %d%s", bts->vty.max_cs_dl,
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200139 VTY_NEWLINE);
140 else
Pau Espin Pedrol343ec9b2020-10-30 18:35:54 +0100141 vty_out(vty, " cs max %d %d%s", bts->vty.max_cs_dl,
142 bts->vty.max_cs_ul, VTY_NEWLINE);
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200143 }
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200144 if (bts->cs_adj_enabled)
145 vty_out(vty, " cs threshold %d %d%s",
146 bts->cs_adj_lower_limit, bts->cs_adj_upper_limit,
147 VTY_NEWLINE);
148 else
149 vty_out(vty, " no cs threshold%s", VTY_NEWLINE);
150
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +0200151 if (bts->cs_downgrade_threshold)
152 vty_out(vty, " cs downgrade-threshold %d%s",
153 bts->cs_downgrade_threshold, VTY_NEWLINE);
154 else
155 vty_out(vty, " no cs downgrade-threshold%s", VTY_NEWLINE);
156
Jacob Erlbeck94cde132015-06-09 09:44:36 +0200157 vty_out(vty, " cs link-quality-ranges cs1 %d cs2 %d %d cs3 %d %d cs4 %d%s",
158 bts->cs_lqual_ranges[0].high,
159 bts->cs_lqual_ranges[1].low,
160 bts->cs_lqual_ranges[1].high,
161 bts->cs_lqual_ranges[2].low,
162 bts->cs_lqual_ranges[2].high,
163 bts->cs_lqual_ranges[3].low,
164 VTY_NEWLINE);
165
Minh-Quang Nguyen1f189092017-08-16 09:50:06 -0400166 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",
167 bts->mcs_lqual_ranges[0].high,
168 bts->mcs_lqual_ranges[1].low,
169 bts->mcs_lqual_ranges[1].high,
170 bts->mcs_lqual_ranges[2].low,
171 bts->mcs_lqual_ranges[2].high,
172 bts->mcs_lqual_ranges[3].low,
173 bts->mcs_lqual_ranges[3].high,
174 bts->mcs_lqual_ranges[4].low,
175 bts->mcs_lqual_ranges[4].high,
176 bts->mcs_lqual_ranges[5].low,
177 bts->mcs_lqual_ranges[5].high,
178 bts->mcs_lqual_ranges[6].low,
179 bts->mcs_lqual_ranges[6].high,
180 bts->mcs_lqual_ranges[7].low,
181 bts->mcs_lqual_ranges[7].high,
182 bts->mcs_lqual_ranges[8].low,
183 VTY_NEWLINE);
184
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +0100185 if (bts->initial_mcs_dl != 1 && bts->initial_mcs_ul != 1) {
186 if (bts->initial_mcs_ul == bts->initial_mcs_dl)
187 vty_out(vty, " mcs %d%s", bts->initial_mcs_dl,
188 VTY_NEWLINE);
189 else
190 vty_out(vty, " mcs %d %d%s", bts->initial_mcs_dl,
191 bts->initial_mcs_ul, VTY_NEWLINE);
192 }
Minh-Quang Nguyen1f189092017-08-16 09:50:06 -0400193
Pau Espin Pedrol343ec9b2020-10-30 18:35:54 +0100194 if (bts->vty.max_mcs_dl && bts->vty.max_mcs_ul) {
195 if (bts->vty.max_mcs_ul == bts->vty.max_mcs_dl)
196 vty_out(vty, " mcs max %d%s", bts->vty.max_mcs_dl,
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100197 VTY_NEWLINE);
198 else
Pau Espin Pedrol343ec9b2020-10-30 18:35:54 +0100199 vty_out(vty, " mcs max %d %d%s", bts->vty.max_mcs_dl,
200 bts->vty.max_mcs_ul, VTY_NEWLINE);
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100201 }
202
Jacob Erlbeck36df7742016-01-19 15:53:30 +0100203 vty_out(vty, " window-size %d %d%s", bts->ws_base, bts->ws_pdch,
204 VTY_NEWLINE);
205
Aravind Sirsikar50b09702016-08-22 17:21:10 +0530206 if (bts->dl_arq_type)
207 vty_out(vty, " egprs dl arq-type arq2%s",
208 VTY_NEWLINE);
209
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200210 if (bts->force_llc_lifetime == 0xffff)
211 vty_out(vty, " queue lifetime infinite%s", VTY_NEWLINE);
212 else if (bts->force_llc_lifetime)
213 vty_out(vty, " queue lifetime %d%s", bts->force_llc_lifetime,
214 VTY_NEWLINE);
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100215 if (bts->llc_discard_csec)
216 vty_out(vty, " queue hysteresis %d%s", bts->llc_discard_csec,
217 VTY_NEWLINE);
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200218 if (bts->llc_idle_ack_csec)
219 vty_out(vty, " queue idle-ack-delay %d%s", bts->llc_idle_ack_csec,
220 VTY_NEWLINE);
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200221 if (bts->llc_codel_interval_msec == LLC_CODEL_USE_DEFAULT)
222 vty_out(vty, " queue codel%s", VTY_NEWLINE);
223 else if (bts->llc_codel_interval_msec == LLC_CODEL_DISABLE)
224 vty_out(vty, " no queue codel%s", VTY_NEWLINE);
225 else
226 vty_out(vty, " queue codel interval %d%s",
227 bts->llc_codel_interval_msec/10, VTY_NEWLINE);
228
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200229 if (bts->alloc_algorithm == alloc_algorithm_a)
230 vty_out(vty, " alloc-algorithm a%s", VTY_NEWLINE);
231 if (bts->alloc_algorithm == alloc_algorithm_b)
232 vty_out(vty, " alloc-algorithm b%s", VTY_NEWLINE);
Jacob Erlbeck400ec022015-07-14 13:31:48 +0200233 if (bts->alloc_algorithm == alloc_algorithm_dynamic)
234 vty_out(vty, " alloc-algorithm dynamic%s", VTY_NEWLINE);
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200235 if (bts->force_two_phase)
236 vty_out(vty, " two-phase-access%s", VTY_NEWLINE);
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200237 vty_out(vty, " alpha %d%s", bts->alpha, VTY_NEWLINE);
238 vty_out(vty, " gamma %d%s", bts->gamma * 2, VTY_NEWLINE);
Oliver Smith45fdc442019-09-05 15:12:20 +0200239 if (!bts->dl_tbf_preemptive_retransmission)
240 vty_out(vty, " no dl-tbf-preemptive-retransmission%s", VTY_NEWLINE);
Pau Espin Pedrolc4178e52017-08-08 15:03:50 +0200241 if (strcmp(bts->pcu_sock_path, PCU_SOCK_DEFAULT))
242 vty_out(vty, " pcu-socket %s%s", bts->pcu_sock_path, VTY_NEWLINE);
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200243
Harald Welte717cdf52017-07-21 21:56:23 +0200244 for (i = 0; i < 32; i++) {
245 unsigned int cs = (1 << i);
246 if (bts->gsmtap_categ_mask & cs) {
247 vty_out(vty, " gsmtap-category %s%s",
248 get_value_string(pcu_gsmtap_categ_names, i), VTY_NEWLINE);
249 }
250 }
251
Harald Welte57d35152018-07-05 03:11:17 +0200252 if (bts->gb_dialect_sns)
253 vty_out(vty, " gb-dialect ip-sns%s", VTY_NEWLINE);
254 else
255 vty_out(vty, " gb-dialect classic%s", VTY_NEWLINE);
256
Pau Espin Pedrol18794422019-09-26 18:25:35 +0200257 osmo_tdef_vty_write(vty, bts->T_defs_pcu, " timer ");
258
Maxc9ce6f92018-01-30 17:53:02 +0100259 return CMD_SUCCESS;
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200260}
261
262/* per-BTS configuration */
Philipp Maier9459ebd2020-09-29 23:31:33 +0200263DEFUN_ATTR(cfg_pcu,
264 cfg_pcu_cmd,
265 "pcu",
266 "BTS specific configure",
267 CMD_ATTR_IMMEDIATE)
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200268{
269 vty->node = PCU_NODE;
270
271 return CMD_SUCCESS;
272}
273
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200274#define EGPRS_STR "EGPRS configuration\n"
275
Philipp Maier9459ebd2020-09-29 23:31:33 +0200276DEFUN_USRATTR(cfg_pcu_egprs,
277 cfg_pcu_egprs_cmd,
278 X(PCU_VTY_ATTR_NEW_TBF),
279 "egprs only",
280 EGPRS_STR "Use EGPRS and disable plain GPRS\n")
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200281{
282 struct gprs_rlcmac_bts *bts = bts_main_data();
283
Pau Espin Pedrol4d166352020-10-26 18:39:51 +0100284 bts->egprs_enabled = true;
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200285
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200286 return CMD_SUCCESS;
287}
288
Philipp Maier9459ebd2020-09-29 23:31:33 +0200289DEFUN_USRATTR(cfg_pcu_no_egprs,
290 cfg_pcu_no_egprs_cmd,
291 X(PCU_VTY_ATTR_NEW_TBF),
292 "no egprs",
293 NO_STR EGPRS_STR)
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200294{
295 struct gprs_rlcmac_bts *bts = bts_main_data();
296
Pau Espin Pedrol4d166352020-10-26 18:39:51 +0100297 bts->egprs_enabled = false;
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200298
299 return CMD_SUCCESS;
300}
301
Philipp Maier9459ebd2020-09-29 23:31:33 +0200302DEFUN_ATTR(cfg_pcu_fc_interval,
303 cfg_pcu_fc_interval_cmd,
304 "flow-control-interval <1-10>",
305 "Interval between sending subsequent Flow Control PDUs\n"
306 "Interval time in seconds\n",
307 CMD_ATTR_IMMEDIATE)
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200308{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200309 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200310
311 bts->fc_interval = atoi(argv[0]);
312
313 return CMD_SUCCESS;
314}
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200315#define FC_STR "BSSGP Flow Control configuration\n"
316#define FC_BMAX_STR(who) "Force a fixed value for the " who " bucket size\n"
317#define FC_LR_STR(who) "Force a fixed value for the " who " leak rate\n"
318
Philipp Maier9459ebd2020-09-29 23:31:33 +0200319DEFUN_ATTR(cfg_pcu_fc_bvc_bucket_size,
320 cfg_pcu_fc_bvc_bucket_size_cmd,
321 "flow-control force-bvc-bucket-size <1-6553500>",
322 FC_STR FC_BMAX_STR("BVC") "Bucket size in octets\n",
323 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200324{
325 struct gprs_rlcmac_bts *bts = bts_main_data();
326
327 bts->fc_bvc_bucket_size = atoi(argv[0]);
328
329 return CMD_SUCCESS;
330}
331
Philipp Maier9459ebd2020-09-29 23:31:33 +0200332DEFUN_ATTR(cfg_pcu_no_fc_bvc_bucket_size,
333 cfg_pcu_no_fc_bvc_bucket_size_cmd,
334 "no flow-control force-bvc-bucket-size",
335 NO_STR FC_STR FC_BMAX_STR("BVC"),
336 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200337{
338 struct gprs_rlcmac_bts *bts = bts_main_data();
339
340 bts->fc_bvc_bucket_size = 0;
341
342 return CMD_SUCCESS;
343}
344
Philipp Maier9459ebd2020-09-29 23:31:33 +0200345DEFUN_ATTR(cfg_pcu_fc_bvc_leak_rate,
346 cfg_pcu_fc_bvc_leak_rate_cmd,
347 "flow-control force-bvc-leak-rate <1-6553500>",
348 FC_STR FC_LR_STR("BVC") "Leak rate in bit/s\n",
349 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200350{
351 struct gprs_rlcmac_bts *bts = bts_main_data();
352
353 bts->fc_bvc_leak_rate = atoi(argv[0]);
354
355 return CMD_SUCCESS;
356}
357
Philipp Maier9459ebd2020-09-29 23:31:33 +0200358DEFUN_ATTR(cfg_pcu_no_fc_bvc_leak_rate,
359 cfg_pcu_no_fc_bvc_leak_rate_cmd,
360 "no flow-control force-bvc-leak-rate",
361 NO_STR FC_STR FC_LR_STR("BVC"),
362 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200363{
364 struct gprs_rlcmac_bts *bts = bts_main_data();
365
366 bts->fc_bvc_leak_rate = 0;
367
368 return CMD_SUCCESS;
369}
370
Philipp Maier9459ebd2020-09-29 23:31:33 +0200371DEFUN_ATTR(cfg_pcu_fc_ms_bucket_size,
372 cfg_pcu_fc_ms_bucket_size_cmd,
373 "flow-control force-ms-bucket-size <1-6553500>",
374 FC_STR FC_BMAX_STR("default MS") "Bucket size in octets\n",
375 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200376{
377 struct gprs_rlcmac_bts *bts = bts_main_data();
378
379 bts->fc_ms_bucket_size = atoi(argv[0]);
380
381 return CMD_SUCCESS;
382}
383
Philipp Maier9459ebd2020-09-29 23:31:33 +0200384DEFUN_ATTR(cfg_pcu_no_fc_ms_bucket_size,
385 cfg_pcu_no_fc_ms_bucket_size_cmd,
386 "no flow-control force-ms-bucket-size",
387 NO_STR FC_STR FC_BMAX_STR("default MS"),
388 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200389{
390 struct gprs_rlcmac_bts *bts = bts_main_data();
391
392 bts->fc_ms_bucket_size = 0;
393
394 return CMD_SUCCESS;
395}
396
Philipp Maier9459ebd2020-09-29 23:31:33 +0200397DEFUN_ATTR(cfg_pcu_fc_ms_leak_rate,
398 cfg_pcu_fc_ms_leak_rate_cmd,
399 "flow-control force-ms-leak-rate <1-6553500>",
400 FC_STR FC_LR_STR("default MS") "Leak rate in bit/s\n",
401 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200402{
403 struct gprs_rlcmac_bts *bts = bts_main_data();
404
405 bts->fc_ms_leak_rate = atoi(argv[0]);
406
407 return CMD_SUCCESS;
408}
409
Philipp Maier9459ebd2020-09-29 23:31:33 +0200410DEFUN_ATTR(cfg_pcu_no_fc_ms_leak_rate,
411 cfg_pcu_no_fc_ms_leak_rate_cmd,
412 "no flow-control force-ms-leak-rate",
413 NO_STR FC_STR FC_LR_STR("default MS"),
414 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200415{
416 struct gprs_rlcmac_bts *bts = bts_main_data();
417
418 bts->fc_ms_leak_rate = 0;
419
420 return CMD_SUCCESS;
421}
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200422
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200423#define FC_BTIME_STR "Set target downlink maximum queueing time (only affects the advertised bucket size)\n"
Philipp Maier9459ebd2020-09-29 23:31:33 +0200424DEFUN_ATTR(cfg_pcu_fc_bucket_time,
425 cfg_pcu_fc_bucket_time_cmd,
426 "flow-control bucket-time <1-65534>",
427 FC_STR FC_BTIME_STR "Time in centi-seconds\n",
428 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200429{
430 struct gprs_rlcmac_bts *bts = bts_main_data();
431
432 bts->fc_bucket_time = atoi(argv[0]);
433
434 return CMD_SUCCESS;
435}
436
Philipp Maier9459ebd2020-09-29 23:31:33 +0200437DEFUN_ATTR(cfg_pcu_no_fc_bucket_time,
438 cfg_pcu_no_fc_bucket_time_cmd,
439 "no flow-control bucket-time",
440 NO_STR FC_STR FC_BTIME_STR,
441 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200442{
443 struct gprs_rlcmac_bts *bts = bts_main_data();
444
445 bts->fc_bucket_time = 0;
446
447 return CMD_SUCCESS;
448}
449
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200450#define CS_STR "Coding Scheme configuration\n"
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200451
Philipp Maier9459ebd2020-09-29 23:31:33 +0200452DEFUN_ATTR(cfg_pcu_cs,
453 cfg_pcu_cs_cmd,
454 "cs <1-4> [<1-4>]",
455 CS_STR
456 "Initial CS value to be used (overrides BTS config)\n"
457 "Use a different initial CS value for the uplink",
458 CMD_ATTR_IMMEDIATE)
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200459{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200460 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200461 uint8_t cs = atoi(argv[0]);
462
463 bts->force_cs = 1;
Andreas Eversberg499ff412012-10-03 14:21:36 +0200464 bts->initial_cs_dl = cs;
465 if (argc > 1)
466 bts->initial_cs_ul = atoi(argv[1]);
467 else
468 bts->initial_cs_ul = cs;
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200469
470 return CMD_SUCCESS;
471}
472
Philipp Maier9459ebd2020-09-29 23:31:33 +0200473DEFUN_ATTR(cfg_pcu_no_cs,
474 cfg_pcu_no_cs_cmd,
475 "no cs",
476 NO_STR CS_STR,
477 CMD_ATTR_IMMEDIATE)
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200478{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200479 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200480
481 bts->force_cs = 0;
482
483 return CMD_SUCCESS;
484}
485
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100486#define CS_MAX_STR "Set maximum values for adaptive CS selection (overrides BTS config)\n"
Philipp Maier9459ebd2020-09-29 23:31:33 +0200487DEFUN_ATTR(cfg_pcu_cs_max,
488 cfg_pcu_cs_max_cmd,
489 "cs max <1-4> [<1-4>]",
490 CS_STR
491 CS_MAX_STR
492 "Maximum CS value to be used\n"
493 "Use a different maximum CS value for the uplink",
494 CMD_ATTR_IMMEDIATE)
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200495{
496 struct gprs_rlcmac_bts *bts = bts_main_data();
Pau Espin Pedrol343ec9b2020-10-30 18:35:54 +0100497 uint8_t cs_dl = atoi(argv[0]);
498 uint8_t cs_ul;
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200499
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200500 if (argc > 1)
Pau Espin Pedrol343ec9b2020-10-30 18:35:54 +0100501 cs_ul = atoi(argv[1]);
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200502 else
Pau Espin Pedrol343ec9b2020-10-30 18:35:54 +0100503 cs_ul = cs_dl;
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200504
Pau Espin Pedrol343ec9b2020-10-30 18:35:54 +0100505 bts_set_max_cs(bts, cs_dl, cs_ul);
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200506 return CMD_SUCCESS;
507}
508
Philipp Maier9459ebd2020-09-29 23:31:33 +0200509DEFUN_ATTR(cfg_pcu_no_cs_max,
510 cfg_pcu_no_cs_max_cmd,
511 "no cs max",
512 NO_STR CS_STR CS_MAX_STR,
513 CMD_ATTR_IMMEDIATE)
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200514{
515 struct gprs_rlcmac_bts *bts = bts_main_data();
516
Pau Espin Pedrol343ec9b2020-10-30 18:35:54 +0100517 bts_set_max_cs(bts, 0, 0);
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200518 return CMD_SUCCESS;
519}
520
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100521#define MCS_STR "Modulation and Coding Scheme configuration (EGPRS)\n"
Philipp Maier9459ebd2020-09-29 23:31:33 +0200522DEFUN_ATTR(cfg_pcu_mcs,
523 cfg_pcu_mcs_cmd,
524 "mcs <1-9> [<1-9>]",
525 MCS_STR
526 "Initial MCS value to be used (default 1)\n"
527 "Use a different initial MCS value for the uplink",
528 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +0100529{
530 struct gprs_rlcmac_bts *bts = bts_main_data();
531 uint8_t cs = atoi(argv[0]);
532
533 bts->initial_mcs_dl = cs;
534 if (argc > 1)
535 bts->initial_mcs_ul = atoi(argv[1]);
536 else
537 bts->initial_mcs_ul = cs;
538
539 return CMD_SUCCESS;
540}
541
Philipp Maier9459ebd2020-09-29 23:31:33 +0200542DEFUN_ATTR(cfg_pcu_no_mcs,
543 cfg_pcu_no_mcs_cmd,
544 "no mcs",
545 NO_STR MCS_STR,
546 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +0100547{
548 struct gprs_rlcmac_bts *bts = bts_main_data();
549
550 bts->initial_mcs_dl = 1;
551 bts->initial_mcs_ul = 1;
552
553 return CMD_SUCCESS;
554}
555
Philipp Maier9459ebd2020-09-29 23:31:33 +0200556DEFUN_ATTR(cfg_pcu_mcs_max,
557 cfg_pcu_mcs_max_cmd,
558 "mcs max <1-9> [<1-9>]",
559 MCS_STR
560 CS_MAX_STR
561 "Maximum MCS value to be used\n"
562 "Use a different maximum MCS value for the uplink",
563 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100564{
565 struct gprs_rlcmac_bts *bts = bts_main_data();
Pau Espin Pedrol343ec9b2020-10-30 18:35:54 +0100566 uint8_t mcs_dl = atoi(argv[0]);
567 uint8_t mcs_ul;
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100568
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100569 if (argc > 1)
Pau Espin Pedrol343ec9b2020-10-30 18:35:54 +0100570 mcs_ul = atoi(argv[1]);
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100571 else
Pau Espin Pedrol343ec9b2020-10-30 18:35:54 +0100572 mcs_ul = mcs_dl;
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100573
Pau Espin Pedrol343ec9b2020-10-30 18:35:54 +0100574 bts_set_max_mcs(bts, mcs_dl, mcs_ul);
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100575 return CMD_SUCCESS;
576}
577
Philipp Maier9459ebd2020-09-29 23:31:33 +0200578DEFUN_ATTR(cfg_pcu_no_mcs_max,
579 cfg_pcu_no_mcs_max_cmd,
580 "no mcs max",
581 NO_STR MCS_STR CS_MAX_STR,
582 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100583{
584 struct gprs_rlcmac_bts *bts = bts_main_data();
585
Pau Espin Pedrol343ec9b2020-10-30 18:35:54 +0100586 bts_set_max_mcs(bts, 0, 0);
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100587 return CMD_SUCCESS;
588}
589
Aravind Sirsikar50b09702016-08-22 17:21:10 +0530590#define DL_STR "downlink specific configuration\n"
591
Philipp Maier9459ebd2020-09-29 23:31:33 +0200592DEFUN_ATTR(cfg_pcu_dl_arq_type,
593 cfg_pcu_dl_arq_cmd,
594 "egprs dl arq-type (spb|arq2)",
595 EGPRS_STR DL_STR "ARQ options\n"
596 "enable SPB(ARQ1) support\n"
597 "enable ARQ2 support",
598 CMD_ATTR_IMMEDIATE)
Aravind Sirsikar50b09702016-08-22 17:21:10 +0530599{
600 struct gprs_rlcmac_bts *bts = bts_main_data();
601
602 if (!strcmp(argv[0], "arq2"))
603 bts->dl_arq_type = 1;
604 else
605 bts->dl_arq_type = 0;
606
607 return CMD_SUCCESS;
608}
609
Philipp Maier9459ebd2020-09-29 23:31:33 +0200610DEFUN_USRATTR(cfg_pcu_window_size,
611 cfg_pcu_window_size_cmd,
612 X(PCU_VTY_ATTR_NEW_TBF),
613 "window-size <0-1024> [<0-256>]",
614 "Window size configuration (b + N_PDCH * f)\n"
615 "Base value (b)\n"
616 "Factor for number of PDCH (f)")
Jacob Erlbeck36df7742016-01-19 15:53:30 +0100617{
618 struct gprs_rlcmac_bts *bts = bts_main_data();
619 uint16_t b = atoi(argv[0]);
620
621 bts->ws_base = b;
622 if (argc > 1) {
623 uint16_t f = atoi(argv[1]);
624 bts->ws_pdch = f;
625 }
626
627 return CMD_SUCCESS;
628}
629
630
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200631#define QUEUE_STR "Packet queue options\n"
632#define LIFETIME_STR "Set lifetime limit of LLC frame in centi-seconds " \
633 "(overrides the value given by SGSN)\n"
634
Philipp Maier9459ebd2020-09-29 23:31:33 +0200635DEFUN_USRATTR(cfg_pcu_queue_lifetime,
636 cfg_pcu_queue_lifetime_cmd,
637 X(PCU_VTY_ATTR_NEW_TBF),
638 "queue lifetime <1-65534>",
639 QUEUE_STR LIFETIME_STR "Lifetime in centi-seconds")
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200640{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200641 struct gprs_rlcmac_bts *bts = bts_main_data();
Jacob Erlbeck2acfbeb2015-04-30 17:55:16 +0200642 uint16_t csec = atoi(argv[0]);
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200643
644 bts->force_llc_lifetime = csec;
645
646 return CMD_SUCCESS;
647}
648
Philipp Maier9459ebd2020-09-29 23:31:33 +0200649DEFUN_USRATTR(cfg_pcu_queue_lifetime_inf,
650 cfg_pcu_queue_lifetime_inf_cmd,
651 X(PCU_VTY_ATTR_NEW_TBF),
652 "queue lifetime infinite",
653 QUEUE_STR LIFETIME_STR "Infinite lifetime")
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200654{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200655 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200656
657 bts->force_llc_lifetime = 0xffff;
658
659 return CMD_SUCCESS;
660}
661
Philipp Maier9459ebd2020-09-29 23:31:33 +0200662DEFUN_USRATTR(cfg_pcu_no_queue_lifetime,
663 cfg_pcu_no_queue_lifetime_cmd,
664 X(PCU_VTY_ATTR_NEW_TBF),
665 "no queue lifetime",
666 NO_STR QUEUE_STR "Disable lifetime limit of LLC frame (use value given "
667 "by SGSN)\n")
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200668{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200669 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200670
671 bts->force_llc_lifetime = 0;
672
673 return CMD_SUCCESS;
674}
675
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100676#define QUEUE_HYSTERESIS_STR "Set lifetime hysteresis of LLC frame in centi-seconds " \
677 "(continue discarding until lifetime-hysteresis is reached)\n"
678
Philipp Maier9459ebd2020-09-29 23:31:33 +0200679DEFUN_USRATTR(cfg_pcu_queue_hysteresis,
680 cfg_pcu_queue_hysteresis_cmd,
681 X(PCU_VTY_ATTR_NEW_TBF),
682 "queue hysteresis <1-65535>",
683 QUEUE_STR QUEUE_HYSTERESIS_STR "Hysteresis in centi-seconds")
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100684{
685 struct gprs_rlcmac_bts *bts = bts_main_data();
Jacob Erlbeck2acfbeb2015-04-30 17:55:16 +0200686 uint16_t csec = atoi(argv[0]);
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100687
688 bts->llc_discard_csec = csec;
689
690 return CMD_SUCCESS;
691}
692
Philipp Maier9459ebd2020-09-29 23:31:33 +0200693DEFUN_USRATTR(cfg_pcu_no_queue_hysteresis,
694 cfg_pcu_no_queue_hysteresis_cmd,
695 X(PCU_VTY_ATTR_NEW_TBF),
696 "no queue hysteresis",
697 NO_STR QUEUE_STR QUEUE_HYSTERESIS_STR)
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100698{
699 struct gprs_rlcmac_bts *bts = bts_main_data();
700
701 bts->llc_discard_csec = 0;
702
703 return CMD_SUCCESS;
704}
705
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200706#define QUEUE_CODEL_STR "Set CoDel queue management\n"
Philipp Maier9459ebd2020-09-29 23:31:33 +0200707DEFUN_USRATTR(cfg_pcu_queue_codel,
708 cfg_pcu_queue_codel_cmd,
709 X(PCU_VTY_ATTR_NEW_SUBSCR),
710 "queue codel",
711 QUEUE_STR QUEUE_CODEL_STR)
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200712{
713 struct gprs_rlcmac_bts *bts = bts_main_data();
714
715 bts->llc_codel_interval_msec = LLC_CODEL_USE_DEFAULT;
716
717 return CMD_SUCCESS;
718}
719
Philipp Maier9459ebd2020-09-29 23:31:33 +0200720DEFUN_USRATTR(cfg_pcu_queue_codel_interval,
721 cfg_pcu_queue_codel_interval_cmd,
722 X(PCU_VTY_ATTR_NEW_SUBSCR),
723 "queue codel interval <1-1000>",
724 QUEUE_STR QUEUE_CODEL_STR "Specify interval\n" "Interval in centi-seconds")
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200725{
726 struct gprs_rlcmac_bts *bts = bts_main_data();
727 uint16_t csec = atoi(argv[0]);
728
729 bts->llc_codel_interval_msec = 10*csec;
730
731 return CMD_SUCCESS;
732}
733
Philipp Maier9459ebd2020-09-29 23:31:33 +0200734DEFUN_USRATTR(cfg_pcu_no_queue_codel,
735 cfg_pcu_no_queue_codel_cmd,
736 X(PCU_VTY_ATTR_NEW_SUBSCR),
737 "no queue codel",
738 NO_STR QUEUE_STR QUEUE_CODEL_STR)
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200739{
740 struct gprs_rlcmac_bts *bts = bts_main_data();
741
742 bts->llc_codel_interval_msec = LLC_CODEL_DISABLE;
743
744 return CMD_SUCCESS;
745}
746
747
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200748#define QUEUE_IDLE_ACK_STR "Request an ACK after the last DL LLC frame in centi-seconds\n"
749
Philipp Maier9459ebd2020-09-29 23:31:33 +0200750DEFUN_ATTR(cfg_pcu_queue_idle_ack_delay,
751 cfg_pcu_queue_idle_ack_delay_cmd,
752 "queue idle-ack-delay <1-65535>",
753 QUEUE_STR QUEUE_IDLE_ACK_STR "Idle ACK delay in centi-seconds",
754 CMD_ATTR_IMMEDIATE)
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200755{
756 struct gprs_rlcmac_bts *bts = bts_main_data();
Jacob Erlbeck2acfbeb2015-04-30 17:55:16 +0200757 uint16_t csec = atoi(argv[0]);
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200758
759 bts->llc_idle_ack_csec = csec;
760
761 return CMD_SUCCESS;
762}
763
Philipp Maier9459ebd2020-09-29 23:31:33 +0200764DEFUN_ATTR(cfg_pcu_no_queue_idle_ack_delay,
765 cfg_pcu_no_queue_idle_ack_delay_cmd,
766 "no queue idle-ack-delay",
767 NO_STR QUEUE_STR QUEUE_IDLE_ACK_STR,
768 CMD_ATTR_IMMEDIATE)
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200769{
770 struct gprs_rlcmac_bts *bts = bts_main_data();
771
772 bts->llc_idle_ack_csec = 0;
773
774 return CMD_SUCCESS;
775}
776
Philipp Maier9459ebd2020-09-29 23:31:33 +0200777DEFUN_ATTR(cfg_pcu_alloc,
778 cfg_pcu_alloc_cmd,
779 "alloc-algorithm (a|b|dynamic)",
780 "Select slot allocation algorithm to use when assigning timeslots on "
781 "PACCH\n"
782 "Single slot is assigned only\n"
783 "Multiple slots are assigned for semi-duplex operation\n"
784 "Dynamically select the algorithm based on the system state\n",
785 CMD_ATTR_IMMEDIATE)
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200786{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200787 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200788
789 switch (argv[0][0]) {
790 case 'a':
791 bts->alloc_algorithm = alloc_algorithm_a;
792 break;
793 case 'b':
794 bts->alloc_algorithm = alloc_algorithm_b;
795 break;
Jacob Erlbeck400ec022015-07-14 13:31:48 +0200796 default:
797 bts->alloc_algorithm = alloc_algorithm_dynamic;
798 break;
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200799 }
800
801 return CMD_SUCCESS;
802}
803
Philipp Maier9459ebd2020-09-29 23:31:33 +0200804DEFUN_ATTR(cfg_pcu_two_phase,
805 cfg_pcu_two_phase_cmd,
806 "two-phase-access",
807 "Force two phase access when MS requests single phase access\n",
808 CMD_ATTR_IMMEDIATE)
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200809{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200810 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200811
812 bts->force_two_phase = 1;
813
814 return CMD_SUCCESS;
815}
816
Philipp Maier9459ebd2020-09-29 23:31:33 +0200817DEFUN_ATTR(cfg_pcu_no_two_phase,
818 cfg_pcu_no_two_phase_cmd,
819 "no two-phase-access",
820 NO_STR "Only use two phase access when requested my MS\n",
821 CMD_ATTR_IMMEDIATE)
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200822{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200823 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200824
825 bts->force_two_phase = 0;
826
827 return CMD_SUCCESS;
828}
829
Philipp Maier9459ebd2020-09-29 23:31:33 +0200830DEFUN_ATTR(cfg_pcu_alpha,
831 cfg_pcu_alpha_cmd,
832 "alpha <0-10>",
833 "Alpha parameter for MS power control in units of 0.1 (see TS 05.08) "
834 "NOTE: Be sure to set Alpha value at System information 13 too.\n"
835 "Alpha in units of 0.1\n",
836 CMD_ATTR_IMMEDIATE)
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200837{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200838 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200839
840 bts->alpha = atoi(argv[0]);
841
842 return CMD_SUCCESS;
843}
844
Philipp Maier9459ebd2020-09-29 23:31:33 +0200845DEFUN_ATTR(cfg_pcu_gamma,
846 cfg_pcu_gamma_cmd,
847 "gamma <0-62>",
848 "Gamma parameter for MS power control in units of dB (see TS 05.08)\n"
849 "Gamma in even unit of dBs\n",
850 CMD_ATTR_IMMEDIATE)
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200851{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200852 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200853
854 bts->gamma = atoi(argv[0]) / 2;
855
856 return CMD_SUCCESS;
857}
858
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +0100859DEFUN(show_bts_stats,
860 show_bts_stats_cmd,
861 "show bts statistics",
862 SHOW_STR "BTS related functionality\nStatistics\n")
863{
864 vty_out_rate_ctr_group(vty, "", bts_main_data_stats());
865 return CMD_SUCCESS;
Daniel Willmann772415f2014-01-15 17:06:51 +0100866}
867
Pau Espin Pedrola1ac2f02020-09-22 17:01:31 +0200868DEFUN(show_bts_pdch,
869 show_bts_pdch_cmd,
870 "show bts pdch",
871 SHOW_STR "BTS related functionality\nPDCH timeslots\n")
872{
873 return pcu_vty_show_bts_pdch(vty, bts_main_data());
874}
875
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100876#define IDLE_TIME_STR "keep an idle DL TBF alive for the time given\n"
Pau Espin Pedrol2b5c6292019-09-09 13:41:00 +0200877DEFUN_DEPRECATED(cfg_pcu_dl_tbf_idle_time,
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100878 cfg_pcu_dl_tbf_idle_time_cmd,
879 "dl-tbf-idle-time <1-5000>",
880 IDLE_TIME_STR "idle time in msec")
881{
Pau Espin Pedrol2b5c6292019-09-09 13:41:00 +0200882 vty_out(vty, "%% 'dl-tbf-idle-time' is now deprecated: use 'timer X2031 <val>' instead%s", VTY_NEWLINE);
883
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100884 struct gprs_rlcmac_bts *bts = bts_main_data();
885
Pau Espin Pedrol2b5c6292019-09-09 13:41:00 +0200886 if (osmo_tdef_set(bts->T_defs_pcu, -2031, atoi(argv[0]), OSMO_TDEF_MS) < 0)
887 return CMD_WARNING;
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100888 return CMD_SUCCESS;
889}
890
Pau Espin Pedrol2b5c6292019-09-09 13:41:00 +0200891DEFUN_DEPRECATED(cfg_pcu_no_dl_tbf_idle_time,
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100892 cfg_pcu_no_dl_tbf_idle_time_cmd,
893 "no dl-tbf-idle-time",
894 NO_STR IDLE_TIME_STR)
895{
Pau Espin Pedrol2b5c6292019-09-09 13:41:00 +0200896 vty_out(vty, "%% 'no dl-tbf-idle-time' is now deprecated: use 'timer X2031 0' instead%s", VTY_NEWLINE);
897
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100898 struct gprs_rlcmac_bts *bts = bts_main_data();
899
Pau Espin Pedrol2b5c6292019-09-09 13:41:00 +0200900 if (osmo_tdef_set(bts->T_defs_pcu, -2031, 0, OSMO_TDEF_MS) < 0)
901 return CMD_WARNING;
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100902 return CMD_SUCCESS;
903}
904
Oliver Smith45fdc442019-09-05 15:12:20 +0200905#define RETRANSMISSION_STR "retransmit blocks even before the MS had a chance to receive them (better throughput," \
906 " less readable traces)"
Philipp Maier9459ebd2020-09-29 23:31:33 +0200907DEFUN_ATTR(cfg_pcu_dl_tbf_preemptive_retransmission,
908 cfg_pcu_dl_tbf_preemptive_retransmission_cmd,
909 "dl-tbf-preemptive-retransmission",
910 RETRANSMISSION_STR " (enabled by default)",
911 CMD_ATTR_IMMEDIATE)
Oliver Smith45fdc442019-09-05 15:12:20 +0200912{
913 struct gprs_rlcmac_bts *bts = bts_main_data();
914
915 bts->dl_tbf_preemptive_retransmission = true;
916
917 return CMD_SUCCESS;
918}
919
Philipp Maier9459ebd2020-09-29 23:31:33 +0200920DEFUN_ATTR(cfg_pcu_no_dl_tbf_preemptive_retransmission,
921 cfg_pcu_no_dl_tbf_preemptive_retransmission_cmd,
922 "no dl-tbf-preemptive-retransmission",
923 NO_STR RETRANSMISSION_STR,
924 CMD_ATTR_IMMEDIATE)
Oliver Smith45fdc442019-09-05 15:12:20 +0200925{
926 struct gprs_rlcmac_bts *bts = bts_main_data();
927
928 bts->dl_tbf_preemptive_retransmission = false;
929
930 return CMD_SUCCESS;
931}
932
Jacob Erlbecka098c192015-05-28 16:11:19 +0200933#define MS_IDLE_TIME_STR "keep an idle MS object alive for the time given\n"
Pau Espin Pedrol63700ea2019-09-09 13:19:06 +0200934DEFUN_DEPRECATED(cfg_pcu_ms_idle_time,
Jacob Erlbecka098c192015-05-28 16:11:19 +0200935 cfg_pcu_ms_idle_time_cmd,
936 "ms-idle-time <1-7200>",
937 MS_IDLE_TIME_STR "idle time in sec")
938{
Pau Espin Pedrol63700ea2019-09-09 13:19:06 +0200939 vty_out(vty, "%% 'ms-idle-time' is now deprecated: use 'timer X2030 <val>' instead%s", VTY_NEWLINE);
940
Jacob Erlbecka098c192015-05-28 16:11:19 +0200941 struct gprs_rlcmac_bts *bts = bts_main_data();
942
Pau Espin Pedrol63700ea2019-09-09 13:19:06 +0200943 if (osmo_tdef_set(bts->T_defs_pcu, -2030, atoi(argv[0]), OSMO_TDEF_S) < 0)
944 return CMD_WARNING;
Jacob Erlbecka098c192015-05-28 16:11:19 +0200945 return CMD_SUCCESS;
946}
947
Pau Espin Pedrol63700ea2019-09-09 13:19:06 +0200948DEFUN_DEPRECATED(cfg_pcu_no_ms_idle_time,
Jacob Erlbecka098c192015-05-28 16:11:19 +0200949 cfg_pcu_no_ms_idle_time_cmd,
950 "no ms-idle-time",
951 NO_STR MS_IDLE_TIME_STR)
952{
Pau Espin Pedrol63700ea2019-09-09 13:19:06 +0200953 vty_out(vty, "%% 'no ms-idle-time' is now deprecated: use 'timer X2030 0' instead%s", VTY_NEWLINE);
954
Jacob Erlbecka098c192015-05-28 16:11:19 +0200955 struct gprs_rlcmac_bts *bts = bts_main_data();
956
Pau Espin Pedrol63700ea2019-09-09 13:19:06 +0200957 if (osmo_tdef_set(bts->T_defs_pcu, -2030, 0, OSMO_TDEF_S) < 0)
958 return CMD_WARNING;
Jacob Erlbecka098c192015-05-28 16:11:19 +0200959 return CMD_SUCCESS;
960}
961
Pau Espin Pedrol1e6eb302019-11-28 17:00:44 +0100962#define CS_ERR_LIMITS_STR "set thresholds for error rate based downlink (M)CS adjustment\n"
Philipp Maier9459ebd2020-09-29 23:31:33 +0200963DEFUN_ATTR(cfg_pcu_cs_err_limits,
964 cfg_pcu_cs_err_limits_cmd,
965 "cs threshold <0-100> <0-100>",
966 CS_STR CS_ERR_LIMITS_STR "lower limit in %\n" "upper limit in %\n",
967 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200968{
969 struct gprs_rlcmac_bts *bts = bts_main_data();
970
971 uint8_t lower_limit = atoi(argv[0]);
972 uint8_t upper_limit = atoi(argv[1]);
973
974 if (lower_limit > upper_limit) {
975 vty_out(vty,
976 "The lower limit must be less than or equal to the "
977 "upper limit.%s", VTY_NEWLINE);
978 return CMD_WARNING;
979 }
980
981 bts->cs_adj_enabled = 1;
982 bts->cs_adj_upper_limit = upper_limit;
983 bts->cs_adj_lower_limit = lower_limit;
984
985 return CMD_SUCCESS;
986}
987
Philipp Maier9459ebd2020-09-29 23:31:33 +0200988DEFUN_ATTR(cfg_pcu_no_cs_err_limits,
989 cfg_pcu_no_cs_err_limits_cmd,
990 "no cs threshold",
991 NO_STR CS_STR CS_ERR_LIMITS_STR,
992 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200993{
994 struct gprs_rlcmac_bts *bts = bts_main_data();
995
996 bts->cs_adj_enabled = 0;
997 bts->cs_adj_upper_limit = 100;
998 bts->cs_adj_lower_limit = 0;
999
1000 return CMD_SUCCESS;
1001}
1002
Pau Espin Pedrol1e6eb302019-11-28 17:00:44 +01001003#define CS_DOWNGRADE_STR "set threshold for data size based downlink (M)CS downgrade\n"
Philipp Maier9459ebd2020-09-29 23:31:33 +02001004DEFUN_ATTR(cfg_pcu_cs_downgrade_thrsh,
1005 cfg_pcu_cs_downgrade_thrsh_cmd,
1006 "cs downgrade-threshold <1-10000>",
1007 CS_STR CS_DOWNGRADE_STR "downgrade if less octets left\n",
1008 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +02001009{
1010 struct gprs_rlcmac_bts *bts = bts_main_data();
1011
1012 bts->cs_downgrade_threshold = atoi(argv[0]);
1013
1014 return CMD_SUCCESS;
1015}
1016
Philipp Maier9459ebd2020-09-29 23:31:33 +02001017DEFUN_ATTR(cfg_pcu_no_cs_downgrade_thrsh,
1018 cfg_pcu_no_cs_downgrade_thrsh_cmd,
1019 "no cs downgrade-threshold",
1020 NO_STR CS_STR CS_DOWNGRADE_STR,
1021 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +02001022{
1023 struct gprs_rlcmac_bts *bts = bts_main_data();
1024
1025 bts->cs_downgrade_threshold = 0;
1026
1027 return CMD_SUCCESS;
1028}
1029
Philipp Maier9459ebd2020-09-29 23:31:33 +02001030DEFUN_ATTR(cfg_pcu_cs_lqual_ranges,
1031 cfg_pcu_cs_lqual_ranges_cmd,
1032 "cs link-quality-ranges cs1 <0-35> cs2 <0-35> <0-35> cs3 <0-35> <0-35> cs4 <0-35>",
1033 CS_STR "Set link quality ranges for each uplink CS\n"
1034 "Set quality range for CS-1 (high value only)\n"
1035 "CS-1 high (dB)\n"
1036 "Set quality range for CS-2\n"
1037 "CS-2 low (dB)\n"
1038 "CS-2 high (dB)\n"
1039 "Set quality range for CS-3\n"
1040 "CS-3 low (dB)\n"
1041 "CS-3 high (dB)\n"
1042 "Set quality range for CS-4 (low value only)\n"
1043 "CS-4 low (dB)\n",
1044 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck94cde132015-06-09 09:44:36 +02001045{
1046 struct gprs_rlcmac_bts *bts = bts_main_data();
1047
1048 uint8_t cs1_high = atoi(argv[0]);
1049 uint8_t cs2_low = atoi(argv[1]);
1050 uint8_t cs2_high = atoi(argv[2]);
1051 uint8_t cs3_low = atoi(argv[3]);
1052 uint8_t cs3_high = atoi(argv[4]);
1053 uint8_t cs4_low = atoi(argv[5]);
1054
1055 bts->cs_lqual_ranges[0].high = cs1_high;
1056 bts->cs_lqual_ranges[1].low = cs2_low;
1057 bts->cs_lqual_ranges[1].high = cs2_high;
1058 bts->cs_lqual_ranges[2].low = cs3_low;
1059 bts->cs_lqual_ranges[2].high = cs3_high;
1060 bts->cs_lqual_ranges[3].low = cs4_low;
1061
1062 return CMD_SUCCESS;
1063}
1064
Philipp Maier9459ebd2020-09-29 23:31:33 +02001065DEFUN_ATTR(cfg_pcu_mcs_lqual_ranges,
1066 cfg_pcu_mcs_lqual_ranges_cmd,
1067 "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>",
1068 CS_STR "Set link quality ranges for each uplink MCS\n"
1069 "Set quality range for MCS-1 (high value only)\n"
1070 "MCS-1 high (dB)\n"
1071 "Set quality range for MCS-2\n"
1072 "MCS-2 high (dB)\n"
1073 "MCS-2 low (dB)\n"
1074 "Set quality range for MCS-3\n"
1075 "MCS-3 high (dB)\n"
1076 "MCS-3 low (dB)\n"
1077 "Set quality range for MCS-4\n"
1078 "MCS-4 high (dB)\n"
1079 "MCS-4 low (dB)\n"
1080 "Set quality range for MCS-5\n"
1081 "MCS-5 high (dB)\n"
1082 "MCS-5 low (dB)\n"
1083 "Set quality range for MCS-6\n"
1084 "MCS-6 low (dB)\n"
1085 "MCS-6 high (dB)\n"
1086 "Set quality range for MCS-7\n"
1087 "MCS-7 low (dB)\n"
1088 "MCS-7 high (dB)\n"
1089 "Set quality range for MCS-8\n"
1090 "MCS-8 low (dB)\n"
1091 "MCS-8 high (dB)\n"
1092 "Set quality range for MCS-9 (low value only)\n"
1093 "MCS-9 low (dB)\n",
1094 CMD_ATTR_IMMEDIATE)
Minh-Quang Nguyen1f189092017-08-16 09:50:06 -04001095{
1096 struct gprs_rlcmac_bts *bts = bts_main_data();
1097
1098 bts->mcs_lqual_ranges[0].high = atoi(argv[0]);
1099 bts->mcs_lqual_ranges[1].low = atoi(argv[1]);
1100 bts->mcs_lqual_ranges[1].high = atoi(argv[2]);
1101 bts->mcs_lqual_ranges[2].low = atoi(argv[3]);
1102 bts->mcs_lqual_ranges[2].high = atoi(argv[4]);
1103 bts->mcs_lqual_ranges[3].low = atoi(argv[5]);
1104 bts->mcs_lqual_ranges[3].high = atoi(argv[6]);
1105 bts->mcs_lqual_ranges[4].low = atoi(argv[7]);
1106 bts->mcs_lqual_ranges[4].high = atoi(argv[8]);
1107 bts->mcs_lqual_ranges[5].low = atoi(argv[9]);
1108 bts->mcs_lqual_ranges[5].high = atoi(argv[10]);
1109 bts->mcs_lqual_ranges[6].low = atoi(argv[11]);
1110 bts->mcs_lqual_ranges[6].high = atoi(argv[12]);
1111 bts->mcs_lqual_ranges[7].low = atoi(argv[13]);
1112 bts->mcs_lqual_ranges[7].high = atoi(argv[14]);
1113 bts->mcs_lqual_ranges[8].low = atoi(argv[15]);
1114
1115 return CMD_SUCCESS;
1116}
1117
Pau Espin Pedrolc4178e52017-08-08 15:03:50 +02001118DEFUN(cfg_pcu_sock,
1119 cfg_pcu_sock_cmd,
1120 "pcu-socket PATH",
1121 "Configure the osmo-bts PCU socket file/path name\n"
1122 "Path of the socket to connect to\n")
1123{
1124 struct gprs_rlcmac_bts *bts = bts_main_data();
1125
Vadim Yanitskiyfc75cc02019-11-30 20:13:25 +07001126 if (vty->type != VTY_FILE)
1127 vty_out(vty, "Changing PCU socket path at run-time has no effect%s", VTY_NEWLINE);
1128
Vadim Yanitskiy657a4c02019-11-30 20:15:22 +07001129 osmo_talloc_replace_string(tall_pcu_ctx, &bts->pcu_sock_path, argv[0]);
Pau Espin Pedrolc4178e52017-08-08 15:03:50 +02001130
1131 return CMD_SUCCESS;
1132}
Jacob Erlbeck94cde132015-06-09 09:44:36 +02001133
Philipp Maier9459ebd2020-09-29 23:31:33 +02001134DEFUN_USRATTR(cfg_pcu_gb_dialect,
1135 cfg_pcu_gb_dialect_cmd,
1136 X(PCU_VTY_ATTR_NS_RESET),
1137 "gb-dialect (classic|ip-sns)",
1138 "Select which Gb interface dialect to use\n"
1139 "Classic Gb interface with NS-{RESET,BLOCK,UNBLOCK} and static configuration\n"
1140 "Modern Gb interface with IP-SNS (Sub Network Service) and dynamic configuration\n")
Harald Welte57d35152018-07-05 03:11:17 +02001141{
1142 struct gprs_rlcmac_bts *bts = bts_main_data();
1143
Alexander Couzens290d9032020-09-16 21:52:02 +02001144 if (!strcmp(argv[0], "ip-sns")) {
Harald Welte57d35152018-07-05 03:11:17 +02001145 bts->gb_dialect_sns = true;
Alexander Couzens290d9032020-09-16 21:52:02 +02001146 gprs_ns2_vty_force_vc_mode(true, NS2_VC_MODE_ALIVE, "gb-dialect is ip-sns");
1147 } else {
Harald Welte57d35152018-07-05 03:11:17 +02001148 bts->gb_dialect_sns = false;
Alexander Couzens290d9032020-09-16 21:52:02 +02001149 gprs_ns2_vty_force_vc_mode(false, 0, NULL);
1150 }
Harald Welte57d35152018-07-05 03:11:17 +02001151
1152 return CMD_SUCCESS;
1153}
1154
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +02001155DEFUN(show_bts_timer, show_bts_timer_cmd,
1156 "show bts-timer " OSMO_TDEF_VTY_ARG_T_OPTIONAL,
1157 SHOW_STR "Show BTS controlled timers\n"
1158 OSMO_TDEF_VTY_DOC_T)
1159{
1160 struct gprs_rlcmac_bts *bts = bts_main_data();
1161 const char *T_arg = argc > 0 ? argv[0] : NULL;
1162 return osmo_tdef_vty_show_cmd(vty, bts->T_defs_bts, T_arg, NULL);
1163}
1164
1165DEFUN(show_timer, show_timer_cmd,
1166 "show timer " OSMO_TDEF_VTY_ARG_T_OPTIONAL,
1167 SHOW_STR "Show PCU timers\n"
1168 OSMO_TDEF_VTY_DOC_T)
1169{
1170 struct gprs_rlcmac_bts *bts = bts_main_data();
1171 const char *T_arg = argc > 0 ? argv[0] : NULL;
1172 return osmo_tdef_vty_show_cmd(vty, bts->T_defs_pcu, T_arg, NULL);
1173}
1174
Philipp Maier9459ebd2020-09-29 23:31:33 +02001175DEFUN_ATTR(cfg_pcu_timer, cfg_pcu_timer_cmd,
1176 "timer " OSMO_TDEF_VTY_ARG_SET_OPTIONAL,
1177 "Configure or show PCU timers\n"
1178 OSMO_TDEF_VTY_DOC_SET,
1179 CMD_ATTR_IMMEDIATE)
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +02001180{
1181 struct gprs_rlcmac_bts *bts = bts_main_data();
1182 /* If any arguments are missing, redirect to 'show' */
1183 if (argc < 2)
1184 return show_timer(self, vty, argc, argv);
1185 return osmo_tdef_vty_set_cmd(vty, bts->T_defs_pcu, argv);
1186}
1187
Daniel Willmann772415f2014-01-15 17:06:51 +01001188DEFUN(show_tbf,
1189 show_tbf_cmd,
Max12a09872018-02-01 16:07:33 +01001190 "show tbf (all|ccch|pacch)",
1191 SHOW_STR "information about TBFs\n"
1192 "All TBFs\n"
1193 "TBFs allocated via CCCH\n"
1194 "TBFs allocated via PACCH\n")
Daniel Willmann772415f2014-01-15 17:06:51 +01001195{
1196 struct gprs_rlcmac_bts *bts = bts_main_data();
Vadim Yanitskiycef2f842019-10-09 21:52:50 +07001197 uint32_t flags = UINT32_MAX;
Max12a09872018-02-01 16:07:33 +01001198
Vadim Yanitskiycef2f842019-10-09 21:52:50 +07001199 if (argv[0][0] == 'c')
1200 flags = (1 << GPRS_RLCMAC_FLAG_CCCH);
1201 else if (argv[0][0] == 'p')
1202 flags = (1 << GPRS_RLCMAC_FLAG_PACCH);
Max12a09872018-02-01 16:07:33 +01001203
Vadim Yanitskiycef2f842019-10-09 21:52:50 +07001204 return pcu_vty_show_tbf_all(vty, bts, flags);
Daniel Willmann772415f2014-01-15 17:06:51 +01001205}
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +01001206
Jacob Erlbeckf47f68a2015-06-04 10:23:24 +02001207DEFUN(show_ms_all,
1208 show_ms_all_cmd,
1209 "show ms all",
1210 SHOW_STR "information about MSs\n" "All TBFs\n")
1211{
1212 struct gprs_rlcmac_bts *bts = bts_main_data();
1213 return pcu_vty_show_ms_all(vty, bts);
1214}
1215
Jacob Erlbeck37e896d2015-06-05 16:33:33 +02001216DEFUN(show_ms_tlli,
1217 show_ms_tlli_cmd,
1218 "show ms tlli TLLI",
1219 SHOW_STR "information about MSs\n" "Select MS by TLLI\n" "TLLI as hex\n")
1220{
1221 struct gprs_rlcmac_bts *bts = bts_main_data();
1222 char *endp = NULL;
1223 unsigned long long tlli = strtoll(argv[0], &endp, 16);
1224 if ((endp != NULL && *endp != 0) || tlli > 0xffffffffULL) {
1225 vty_out(vty, "Invalid TLLI.%s", VTY_NEWLINE);
1226 return CMD_WARNING;
1227 }
1228 return pcu_vty_show_ms_by_tlli(vty, bts, (uint32_t)tlli);
1229}
1230
1231DEFUN(show_ms_imsi,
1232 show_ms_imsi_cmd,
1233 "show ms imsi IMSI",
1234 SHOW_STR "information about MSs\n" "Select MS by IMSI\n" "IMSI\n")
1235{
1236 struct gprs_rlcmac_bts *bts = bts_main_data();
1237 return pcu_vty_show_ms_by_imsi(vty, bts, argv[0]);
1238}
1239
Andreas Eversberg12942562012-07-12 14:31:57 +02001240static const char pcu_copyright[] =
Harald Welted1e340f2013-01-17 12:24:29 +01001241 "Copyright (C) 2012 by Ivan Kluchnikov <kluchnikovi@gmail.com> and \r\n"
1242 " Andreas Eversberg <jolly@eversberg.eu>\r\n"
Andreas Eversberg12942562012-07-12 14:31:57 +02001243 "License GNU GPL version 2 or later\r\n"
1244 "This is free software: you are free to change and redistribute it.\r\n"
1245 "There is NO WARRANTY, to the extent permitted by law.\r\n";
1246
1247struct vty_app_info pcu_vty_info = {
Pau Espin Pedrold0fc9e82019-11-29 13:37:45 +01001248 .name = "OsmoPCU",
Andreas Eversberg12942562012-07-12 14:31:57 +02001249 .version = PACKAGE_VERSION,
1250 .copyright = pcu_copyright,
Philipp Maier9459ebd2020-09-29 23:31:33 +02001251 .usr_attr_desc = {
1252 [PCU_VTY_ATTR_NEW_TBF] = \
1253 "This command applies when a new TBF is begins",
1254 [PCU_VTY_ATTR_NEW_SUBSCR] = \
1255 "This command applies when a new subscriber attaches",
1256 [PCU_VTY_ATTR_NS_RESET] = \
1257 "This command applies when the NS is reset",
1258 },
1259 .usr_attr_letters = {
1260 [PCU_VTY_ATTR_NEW_TBF] = 'n',
1261 [PCU_VTY_ATTR_NEW_SUBSCR] = 's',
1262 [PCU_VTY_ATTR_NS_RESET] = 'r',
1263 },
Andreas Eversberg12942562012-07-12 14:31:57 +02001264};
1265
Pau Espin Pedrolcd2ac562019-08-05 14:30:44 +02001266int pcu_vty_init(void)
Andreas Eversberg12942562012-07-12 14:31:57 +02001267{
1268// install_element_ve(&show_pcu_cmd);
1269
Harald Welte717cdf52017-07-21 21:56:23 +02001270 cfg_pcu_gsmtap_categ_cmd.string = vty_cmd_string_from_valstr(tall_pcu_ctx, pcu_gsmtap_categ_names,
1271 "gsmtap-category (",
1272 "|",")", VTY_DO_LOWER);
1273 cfg_pcu_gsmtap_categ_cmd.doc = vty_cmd_string_from_valstr(tall_pcu_ctx, pcu_gsmtap_categ_help,
1274 "GSMTAP Category\n",
1275 "\n", "", 0);
1276 cfg_pcu_no_gsmtap_categ_cmd.string = vty_cmd_string_from_valstr(tall_pcu_ctx, pcu_gsmtap_categ_names,
1277 "no gsmtap-category (",
1278 "|",")", VTY_DO_LOWER);
1279 cfg_pcu_no_gsmtap_categ_cmd.doc = vty_cmd_string_from_valstr(tall_pcu_ctx, pcu_gsmtap_categ_help,
1280 NO_STR "GSMTAP Category\n",
1281 "\n", "", 0);
1282
Pau Espin Pedrolcd2ac562019-08-05 14:30:44 +02001283 logging_vty_add_cmds();
1284 osmo_stats_vty_add_cmds();
Vadim Yanitskiyd83c8ff2020-02-06 16:46:17 +07001285 osmo_talloc_vty_add_cmds();
Andreas Eversberg12942562012-07-12 14:31:57 +02001286
Andreas Eversberg8b761a32012-07-20 21:50:31 +02001287 install_node(&pcu_node, config_write_pcu);
1288 install_element(CONFIG_NODE, &cfg_pcu_cmd);
Jacob Erlbeck953c7892015-09-28 18:12:57 +02001289 install_element(PCU_NODE, &cfg_pcu_egprs_cmd);
1290 install_element(PCU_NODE, &cfg_pcu_no_egprs_cmd);
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +02001291 install_element(PCU_NODE, &cfg_pcu_no_two_phase_cmd);
Andreas Eversberg8b761a32012-07-20 21:50:31 +02001292 install_element(PCU_NODE, &cfg_pcu_cs_cmd);
1293 install_element(PCU_NODE, &cfg_pcu_no_cs_cmd);
Jacob Erlbeckb33e6752015-06-04 19:04:30 +02001294 install_element(PCU_NODE, &cfg_pcu_cs_max_cmd);
1295 install_element(PCU_NODE, &cfg_pcu_no_cs_max_cmd);
Jacob Erlbeck8322d082015-06-04 15:12:10 +02001296 install_element(PCU_NODE, &cfg_pcu_cs_err_limits_cmd);
1297 install_element(PCU_NODE, &cfg_pcu_no_cs_err_limits_cmd);
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +02001298 install_element(PCU_NODE, &cfg_pcu_cs_downgrade_thrsh_cmd);
1299 install_element(PCU_NODE, &cfg_pcu_no_cs_downgrade_thrsh_cmd);
Jacob Erlbeck94cde132015-06-09 09:44:36 +02001300 install_element(PCU_NODE, &cfg_pcu_cs_lqual_ranges_cmd);
Minh-Quang Nguyen1f189092017-08-16 09:50:06 -04001301 install_element(PCU_NODE, &cfg_pcu_mcs_lqual_ranges_cmd);
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +01001302 install_element(PCU_NODE, &cfg_pcu_mcs_cmd);
Aravind Sirsikar50b09702016-08-22 17:21:10 +05301303 install_element(PCU_NODE, &cfg_pcu_dl_arq_cmd);
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +01001304 install_element(PCU_NODE, &cfg_pcu_no_mcs_cmd);
Jacob Erlbeck0d058052016-01-07 11:48:28 +01001305 install_element(PCU_NODE, &cfg_pcu_mcs_max_cmd);
1306 install_element(PCU_NODE, &cfg_pcu_no_mcs_max_cmd);
Jacob Erlbeck36df7742016-01-19 15:53:30 +01001307 install_element(PCU_NODE, &cfg_pcu_window_size_cmd);
Andreas Eversberg24131bf2012-07-21 11:09:58 +02001308 install_element(PCU_NODE, &cfg_pcu_queue_lifetime_cmd);
1309 install_element(PCU_NODE, &cfg_pcu_queue_lifetime_inf_cmd);
1310 install_element(PCU_NODE, &cfg_pcu_no_queue_lifetime_cmd);
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +01001311 install_element(PCU_NODE, &cfg_pcu_queue_hysteresis_cmd);
1312 install_element(PCU_NODE, &cfg_pcu_no_queue_hysteresis_cmd);
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +02001313 install_element(PCU_NODE, &cfg_pcu_queue_codel_cmd);
1314 install_element(PCU_NODE, &cfg_pcu_queue_codel_interval_cmd);
1315 install_element(PCU_NODE, &cfg_pcu_no_queue_codel_cmd);
Jacob Erlbeckd0261b72015-04-02 13:58:09 +02001316 install_element(PCU_NODE, &cfg_pcu_queue_idle_ack_delay_cmd);
1317 install_element(PCU_NODE, &cfg_pcu_no_queue_idle_ack_delay_cmd);
Andreas Eversberga1503fa2012-07-22 08:58:09 +02001318 install_element(PCU_NODE, &cfg_pcu_alloc_cmd);
Andreas Eversberg07e97cf2012-08-07 16:00:56 +02001319 install_element(PCU_NODE, &cfg_pcu_two_phase_cmd);
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +02001320 install_element(PCU_NODE, &cfg_pcu_fc_interval_cmd);
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +02001321 install_element(PCU_NODE, &cfg_pcu_fc_bucket_time_cmd);
1322 install_element(PCU_NODE, &cfg_pcu_no_fc_bucket_time_cmd);
Jacob Erlbeck87d73412015-04-21 12:56:48 +02001323 install_element(PCU_NODE, &cfg_pcu_fc_bvc_bucket_size_cmd);
1324 install_element(PCU_NODE, &cfg_pcu_no_fc_bvc_bucket_size_cmd);
1325 install_element(PCU_NODE, &cfg_pcu_fc_bvc_leak_rate_cmd);
1326 install_element(PCU_NODE, &cfg_pcu_no_fc_bvc_leak_rate_cmd);
1327 install_element(PCU_NODE, &cfg_pcu_fc_ms_bucket_size_cmd);
1328 install_element(PCU_NODE, &cfg_pcu_no_fc_ms_bucket_size_cmd);
1329 install_element(PCU_NODE, &cfg_pcu_fc_ms_leak_rate_cmd);
1330 install_element(PCU_NODE, &cfg_pcu_no_fc_ms_leak_rate_cmd);
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +02001331 install_element(PCU_NODE, &cfg_pcu_alpha_cmd);
1332 install_element(PCU_NODE, &cfg_pcu_gamma_cmd);
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +01001333 install_element(PCU_NODE, &cfg_pcu_dl_tbf_idle_time_cmd);
1334 install_element(PCU_NODE, &cfg_pcu_no_dl_tbf_idle_time_cmd);
Oliver Smith45fdc442019-09-05 15:12:20 +02001335 install_element(PCU_NODE, &cfg_pcu_dl_tbf_preemptive_retransmission_cmd);
1336 install_element(PCU_NODE, &cfg_pcu_no_dl_tbf_preemptive_retransmission_cmd);
Jacob Erlbecka098c192015-05-28 16:11:19 +02001337 install_element(PCU_NODE, &cfg_pcu_ms_idle_time_cmd);
1338 install_element(PCU_NODE, &cfg_pcu_no_ms_idle_time_cmd);
Harald Welte717cdf52017-07-21 21:56:23 +02001339 install_element(PCU_NODE, &cfg_pcu_gsmtap_categ_cmd);
1340 install_element(PCU_NODE, &cfg_pcu_no_gsmtap_categ_cmd);
Pau Espin Pedrolc4178e52017-08-08 15:03:50 +02001341 install_element(PCU_NODE, &cfg_pcu_sock_cmd);
Harald Welte57d35152018-07-05 03:11:17 +02001342 install_element(PCU_NODE, &cfg_pcu_gb_dialect_cmd);
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +02001343 install_element(PCU_NODE, &cfg_pcu_timer_cmd);
Andreas Eversberg8b761a32012-07-20 21:50:31 +02001344
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +01001345 install_element_ve(&show_bts_stats_cmd);
Pau Espin Pedrola1ac2f02020-09-22 17:01:31 +02001346 install_element_ve(&show_bts_pdch_cmd);
Daniel Willmann772415f2014-01-15 17:06:51 +01001347 install_element_ve(&show_tbf_cmd);
Jacob Erlbeckf47f68a2015-06-04 10:23:24 +02001348 install_element_ve(&show_ms_all_cmd);
Jacob Erlbeck37e896d2015-06-05 16:33:33 +02001349 install_element_ve(&show_ms_tlli_cmd);
1350 install_element_ve(&show_ms_imsi_cmd);
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +02001351 install_element_ve(&show_bts_timer_cmd);
1352 install_element_ve(&show_timer_cmd);
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +01001353
Andreas Eversberg12942562012-07-12 14:31:57 +02001354 return 0;
1355}