blob: b5c70c7708e08a5a62b32555bf07e2f396a2fc4e [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{
Harald Welte717cdf52017-07-21 21:56:23 +020073 int categ;
74
75 categ = get_string_value(pcu_gsmtap_categ_names, argv[0]);
76 if (categ < 0)
77 return CMD_WARNING;
78
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +010079 the_pcu->gsmtap_categ_mask |= (1 << categ);
Harald Welte717cdf52017-07-21 21:56:23 +020080
81 return CMD_SUCCESS;
82}
83
84DEFUN(cfg_pcu_no_gsmtap_categ, cfg_pcu_no_gsmtap_categ_cmd, "HIDDEN", "HIDDEN")
85{
Harald Welte717cdf52017-07-21 21:56:23 +020086 int categ;
87
88 categ = get_string_value(pcu_gsmtap_categ_names, argv[0]);
89 if (categ < 0)
90 return CMD_WARNING;
91
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +010092 the_pcu->gsmtap_categ_mask &= ~(1 << categ);
Harald Welte717cdf52017-07-21 21:56:23 +020093
94 return CMD_SUCCESS;
95}
96
Andreas Eversberg8b761a32012-07-20 21:50:31 +020097static struct cmd_node pcu_node = {
98 (enum node_type) PCU_NODE,
Jacob Erlbeckcc12f022015-04-09 15:45:24 +020099 "%s(config-pcu)# ",
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200100 1,
101};
102
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200103static int config_write_pcu(struct vty *vty)
104{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200105 struct gprs_rlcmac_bts *bts = bts_main_data();
Harald Welte717cdf52017-07-21 21:56:23 +0200106 unsigned int i;
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200107
108 vty_out(vty, "pcu%s", VTY_NEWLINE);
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200109 vty_out(vty, " flow-control-interval %d%s", bts->fc_interval,
110 VTY_NEWLINE);
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200111 if (bts->fc_bvc_bucket_size)
112 vty_out(vty, " flow-control force-bvc-bucket-size %d%s",
113 bts->fc_bvc_bucket_size, VTY_NEWLINE);
114 if (bts->fc_bvc_leak_rate)
115 vty_out(vty, " flow-control force-bvc-leak-rate %d%s",
116 bts->fc_bvc_leak_rate, VTY_NEWLINE);
117 if (bts->fc_ms_bucket_size)
118 vty_out(vty, " flow-control force-ms-bucket-size %d%s",
119 bts->fc_ms_bucket_size, VTY_NEWLINE);
120 if (bts->fc_ms_leak_rate)
121 vty_out(vty, " flow-control force-ms-leak-rate %d%s",
122 bts->fc_ms_leak_rate, VTY_NEWLINE);
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100123 if (the_pcu->vty.force_initial_cs) {
Andreas Eversberg499ff412012-10-03 14:21:36 +0200124 if (bts->initial_cs_ul == bts->initial_cs_dl)
125 vty_out(vty, " cs %d%s", bts->initial_cs_dl,
126 VTY_NEWLINE);
127 else
128 vty_out(vty, " cs %d %d%s", bts->initial_cs_dl,
129 bts->initial_cs_ul, VTY_NEWLINE);
Holger Hans Peter Freytherc421e8a2014-07-02 14:55:17 +0200130 }
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100131 if (the_pcu->vty.max_cs_dl && the_pcu->vty.max_cs_ul) {
132 if (the_pcu->vty.max_cs_ul == the_pcu->vty.max_cs_dl)
133 vty_out(vty, " cs max %d%s", the_pcu->vty.max_cs_dl,
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200134 VTY_NEWLINE);
135 else
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100136 vty_out(vty, " cs max %d %d%s", the_pcu->vty.max_cs_dl,
137 the_pcu->vty.max_cs_ul, VTY_NEWLINE);
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200138 }
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200139 if (bts->cs_adj_enabled)
140 vty_out(vty, " cs threshold %d %d%s",
141 bts->cs_adj_lower_limit, bts->cs_adj_upper_limit,
142 VTY_NEWLINE);
143 else
144 vty_out(vty, " no cs threshold%s", VTY_NEWLINE);
145
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +0200146 if (bts->cs_downgrade_threshold)
147 vty_out(vty, " cs downgrade-threshold %d%s",
148 bts->cs_downgrade_threshold, VTY_NEWLINE);
149 else
150 vty_out(vty, " no cs downgrade-threshold%s", VTY_NEWLINE);
151
Jacob Erlbeck94cde132015-06-09 09:44:36 +0200152 vty_out(vty, " cs link-quality-ranges cs1 %d cs2 %d %d cs3 %d %d cs4 %d%s",
153 bts->cs_lqual_ranges[0].high,
154 bts->cs_lqual_ranges[1].low,
155 bts->cs_lqual_ranges[1].high,
156 bts->cs_lqual_ranges[2].low,
157 bts->cs_lqual_ranges[2].high,
158 bts->cs_lqual_ranges[3].low,
159 VTY_NEWLINE);
160
Minh-Quang Nguyen1f189092017-08-16 09:50:06 -0400161 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",
162 bts->mcs_lqual_ranges[0].high,
163 bts->mcs_lqual_ranges[1].low,
164 bts->mcs_lqual_ranges[1].high,
165 bts->mcs_lqual_ranges[2].low,
166 bts->mcs_lqual_ranges[2].high,
167 bts->mcs_lqual_ranges[3].low,
168 bts->mcs_lqual_ranges[3].high,
169 bts->mcs_lqual_ranges[4].low,
170 bts->mcs_lqual_ranges[4].high,
171 bts->mcs_lqual_ranges[5].low,
172 bts->mcs_lqual_ranges[5].high,
173 bts->mcs_lqual_ranges[6].low,
174 bts->mcs_lqual_ranges[6].high,
175 bts->mcs_lqual_ranges[7].low,
176 bts->mcs_lqual_ranges[7].high,
177 bts->mcs_lqual_ranges[8].low,
178 VTY_NEWLINE);
179
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100180 if (the_pcu->vty.force_initial_mcs) {
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +0100181 if (bts->initial_mcs_ul == bts->initial_mcs_dl)
182 vty_out(vty, " mcs %d%s", bts->initial_mcs_dl,
183 VTY_NEWLINE);
184 else
185 vty_out(vty, " mcs %d %d%s", bts->initial_mcs_dl,
186 bts->initial_mcs_ul, VTY_NEWLINE);
187 }
Minh-Quang Nguyen1f189092017-08-16 09:50:06 -0400188
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100189 if (the_pcu->vty.max_mcs_dl && the_pcu->vty.max_mcs_ul) {
190 if (the_pcu->vty.max_mcs_ul == the_pcu->vty.max_mcs_dl)
191 vty_out(vty, " mcs max %d%s", the_pcu->vty.max_mcs_dl,
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100192 VTY_NEWLINE);
193 else
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100194 vty_out(vty, " mcs max %d %d%s", the_pcu->vty.max_mcs_dl,
195 the_pcu->vty.max_mcs_ul, VTY_NEWLINE);
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100196 }
197
Jacob Erlbeck36df7742016-01-19 15:53:30 +0100198 vty_out(vty, " window-size %d %d%s", bts->ws_base, bts->ws_pdch,
199 VTY_NEWLINE);
200
Aravind Sirsikar50b09702016-08-22 17:21:10 +0530201 if (bts->dl_arq_type)
202 vty_out(vty, " egprs dl arq-type arq2%s",
203 VTY_NEWLINE);
204
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200205 if (bts->force_llc_lifetime == 0xffff)
206 vty_out(vty, " queue lifetime infinite%s", VTY_NEWLINE);
207 else if (bts->force_llc_lifetime)
208 vty_out(vty, " queue lifetime %d%s", bts->force_llc_lifetime,
209 VTY_NEWLINE);
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100210 if (bts->llc_discard_csec)
211 vty_out(vty, " queue hysteresis %d%s", bts->llc_discard_csec,
212 VTY_NEWLINE);
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200213 if (bts->llc_idle_ack_csec)
214 vty_out(vty, " queue idle-ack-delay %d%s", bts->llc_idle_ack_csec,
215 VTY_NEWLINE);
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200216 if (bts->llc_codel_interval_msec == LLC_CODEL_USE_DEFAULT)
217 vty_out(vty, " queue codel%s", VTY_NEWLINE);
218 else if (bts->llc_codel_interval_msec == LLC_CODEL_DISABLE)
219 vty_out(vty, " no queue codel%s", VTY_NEWLINE);
220 else
221 vty_out(vty, " queue codel interval %d%s",
222 bts->llc_codel_interval_msec/10, VTY_NEWLINE);
223
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100224 if (the_pcu->alloc_algorithm == alloc_algorithm_a)
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200225 vty_out(vty, " alloc-algorithm a%s", VTY_NEWLINE);
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100226 if (the_pcu->alloc_algorithm == alloc_algorithm_b)
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200227 vty_out(vty, " alloc-algorithm b%s", VTY_NEWLINE);
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100228 if (the_pcu->alloc_algorithm == alloc_algorithm_dynamic)
Jacob Erlbeck400ec022015-07-14 13:31:48 +0200229 vty_out(vty, " alloc-algorithm dynamic%s", VTY_NEWLINE);
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200230 if (bts->force_two_phase)
231 vty_out(vty, " two-phase-access%s", VTY_NEWLINE);
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200232 vty_out(vty, " alpha %d%s", bts->alpha, VTY_NEWLINE);
233 vty_out(vty, " gamma %d%s", bts->gamma * 2, VTY_NEWLINE);
Oliver Smith45fdc442019-09-05 15:12:20 +0200234 if (!bts->dl_tbf_preemptive_retransmission)
235 vty_out(vty, " no dl-tbf-preemptive-retransmission%s", VTY_NEWLINE);
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100236 if (strcmp(the_pcu->pcu_sock_path, PCU_SOCK_DEFAULT))
237 vty_out(vty, " pcu-socket %s%s", the_pcu->pcu_sock_path, VTY_NEWLINE);
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200238
Harald Welte717cdf52017-07-21 21:56:23 +0200239 for (i = 0; i < 32; i++) {
240 unsigned int cs = (1 << i);
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100241 if (the_pcu->gsmtap_categ_mask & cs) {
Harald Welte717cdf52017-07-21 21:56:23 +0200242 vty_out(vty, " gsmtap-category %s%s",
243 get_value_string(pcu_gsmtap_categ_names, i), VTY_NEWLINE);
244 }
245 }
246
Alexander Couzens5012e072020-12-06 01:23:51 +0100247 if (bts->ns_dialect == NS2_DIALECT_SNS)
Harald Welte57d35152018-07-05 03:11:17 +0200248 vty_out(vty, " gb-dialect ip-sns%s", VTY_NEWLINE);
249 else
250 vty_out(vty, " gb-dialect classic%s", VTY_NEWLINE);
251
Pau Espin Pedrol18794422019-09-26 18:25:35 +0200252 osmo_tdef_vty_write(vty, bts->T_defs_pcu, " timer ");
253
Maxc9ce6f92018-01-30 17:53:02 +0100254 return CMD_SUCCESS;
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200255}
256
257/* per-BTS configuration */
Philipp Maier9459ebd2020-09-29 23:31:33 +0200258DEFUN_ATTR(cfg_pcu,
259 cfg_pcu_cmd,
260 "pcu",
261 "BTS specific configure",
262 CMD_ATTR_IMMEDIATE)
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200263{
264 vty->node = PCU_NODE;
265
266 return CMD_SUCCESS;
267}
268
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200269#define EGPRS_STR "EGPRS configuration\n"
270
Pau Espin Pedrol270c9ea2020-10-30 17:15:32 +0100271DEFUN_DEPRECATED(cfg_pcu_egprs,
272 cfg_pcu_egprs_cmd,
273 "egprs only",
274 EGPRS_STR "Use EGPRS and disable plain GPRS\n")
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200275{
Pau Espin Pedrol270c9ea2020-10-30 17:15:32 +0100276 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 +0200277 return CMD_SUCCESS;
278}
279
Pau Espin Pedrol270c9ea2020-10-30 17:15:32 +0100280DEFUN_DEPRECATED(cfg_pcu_no_egprs,
281 cfg_pcu_no_egprs_cmd,
282 "no egprs",
283 NO_STR EGPRS_STR)
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200284{
Pau Espin Pedrol270c9ea2020-10-30 17:15:32 +0100285 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 +0200286 return CMD_SUCCESS;
287}
288
Philipp Maier9459ebd2020-09-29 23:31:33 +0200289DEFUN_ATTR(cfg_pcu_fc_interval,
290 cfg_pcu_fc_interval_cmd,
291 "flow-control-interval <1-10>",
292 "Interval between sending subsequent Flow Control PDUs\n"
293 "Interval time in seconds\n",
294 CMD_ATTR_IMMEDIATE)
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200295{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200296 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200297
298 bts->fc_interval = atoi(argv[0]);
299
300 return CMD_SUCCESS;
301}
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200302#define FC_STR "BSSGP Flow Control configuration\n"
303#define FC_BMAX_STR(who) "Force a fixed value for the " who " bucket size\n"
304#define FC_LR_STR(who) "Force a fixed value for the " who " leak rate\n"
305
Philipp Maier9459ebd2020-09-29 23:31:33 +0200306DEFUN_ATTR(cfg_pcu_fc_bvc_bucket_size,
307 cfg_pcu_fc_bvc_bucket_size_cmd,
308 "flow-control force-bvc-bucket-size <1-6553500>",
309 FC_STR FC_BMAX_STR("BVC") "Bucket size in octets\n",
310 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200311{
312 struct gprs_rlcmac_bts *bts = bts_main_data();
313
314 bts->fc_bvc_bucket_size = atoi(argv[0]);
315
316 return CMD_SUCCESS;
317}
318
Philipp Maier9459ebd2020-09-29 23:31:33 +0200319DEFUN_ATTR(cfg_pcu_no_fc_bvc_bucket_size,
320 cfg_pcu_no_fc_bvc_bucket_size_cmd,
321 "no flow-control force-bvc-bucket-size",
322 NO_STR FC_STR FC_BMAX_STR("BVC"),
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 = 0;
328
329 return CMD_SUCCESS;
330}
331
Philipp Maier9459ebd2020-09-29 23:31:33 +0200332DEFUN_ATTR(cfg_pcu_fc_bvc_leak_rate,
333 cfg_pcu_fc_bvc_leak_rate_cmd,
334 "flow-control force-bvc-leak-rate <1-6553500>",
335 FC_STR FC_LR_STR("BVC") "Leak rate in bit/s\n",
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_leak_rate = atoi(argv[0]);
341
342 return CMD_SUCCESS;
343}
344
Philipp Maier9459ebd2020-09-29 23:31:33 +0200345DEFUN_ATTR(cfg_pcu_no_fc_bvc_leak_rate,
346 cfg_pcu_no_fc_bvc_leak_rate_cmd,
347 "no flow-control force-bvc-leak-rate",
348 NO_STR FC_STR FC_LR_STR("BVC"),
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 = 0;
354
355 return CMD_SUCCESS;
356}
357
Philipp Maier9459ebd2020-09-29 23:31:33 +0200358DEFUN_ATTR(cfg_pcu_fc_ms_bucket_size,
359 cfg_pcu_fc_ms_bucket_size_cmd,
360 "flow-control force-ms-bucket-size <1-6553500>",
361 FC_STR FC_BMAX_STR("default MS") "Bucket size in octets\n",
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_ms_bucket_size = atoi(argv[0]);
367
368 return CMD_SUCCESS;
369}
370
Philipp Maier9459ebd2020-09-29 23:31:33 +0200371DEFUN_ATTR(cfg_pcu_no_fc_ms_bucket_size,
372 cfg_pcu_no_fc_ms_bucket_size_cmd,
373 "no flow-control force-ms-bucket-size",
374 NO_STR FC_STR FC_BMAX_STR("default MS"),
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 = 0;
380
381 return CMD_SUCCESS;
382}
383
Philipp Maier9459ebd2020-09-29 23:31:33 +0200384DEFUN_ATTR(cfg_pcu_fc_ms_leak_rate,
385 cfg_pcu_fc_ms_leak_rate_cmd,
386 "flow-control force-ms-leak-rate <1-6553500>",
387 FC_STR FC_LR_STR("default MS") "Leak rate in bit/s\n",
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_leak_rate = atoi(argv[0]);
393
394 return CMD_SUCCESS;
395}
396
Philipp Maier9459ebd2020-09-29 23:31:33 +0200397DEFUN_ATTR(cfg_pcu_no_fc_ms_leak_rate,
398 cfg_pcu_no_fc_ms_leak_rate_cmd,
399 "no flow-control force-ms-leak-rate",
400 NO_STR FC_STR FC_LR_STR("default MS"),
401 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 = 0;
406
407 return CMD_SUCCESS;
408}
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200409
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200410#define FC_BTIME_STR "Set target downlink maximum queueing time (only affects the advertised bucket size)\n"
Philipp Maier9459ebd2020-09-29 23:31:33 +0200411DEFUN_ATTR(cfg_pcu_fc_bucket_time,
412 cfg_pcu_fc_bucket_time_cmd,
413 "flow-control bucket-time <1-65534>",
414 FC_STR FC_BTIME_STR "Time in centi-seconds\n",
415 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200416{
417 struct gprs_rlcmac_bts *bts = bts_main_data();
418
419 bts->fc_bucket_time = atoi(argv[0]);
420
421 return CMD_SUCCESS;
422}
423
Philipp Maier9459ebd2020-09-29 23:31:33 +0200424DEFUN_ATTR(cfg_pcu_no_fc_bucket_time,
425 cfg_pcu_no_fc_bucket_time_cmd,
426 "no flow-control bucket-time",
427 NO_STR FC_STR FC_BTIME_STR,
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 = 0;
433
434 return CMD_SUCCESS;
435}
436
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200437#define CS_STR "Coding Scheme configuration\n"
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200438
Philipp Maier9459ebd2020-09-29 23:31:33 +0200439DEFUN_ATTR(cfg_pcu_cs,
440 cfg_pcu_cs_cmd,
441 "cs <1-4> [<1-4>]",
442 CS_STR
443 "Initial CS value to be used (overrides BTS config)\n"
444 "Use a different initial CS value for the uplink",
445 CMD_ATTR_IMMEDIATE)
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200446{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200447 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200448 uint8_t cs = atoi(argv[0]);
449
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100450 the_pcu->vty.force_initial_cs = true;
Andreas Eversberg499ff412012-10-03 14:21:36 +0200451 bts->initial_cs_dl = cs;
452 if (argc > 1)
453 bts->initial_cs_ul = atoi(argv[1]);
454 else
455 bts->initial_cs_ul = cs;
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200456
457 return CMD_SUCCESS;
458}
459
Philipp Maier9459ebd2020-09-29 23:31:33 +0200460DEFUN_ATTR(cfg_pcu_no_cs,
461 cfg_pcu_no_cs_cmd,
462 "no cs",
463 NO_STR CS_STR,
464 CMD_ATTR_IMMEDIATE)
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200465{
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100466 the_pcu->vty.force_initial_cs = false;
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200467
468 return CMD_SUCCESS;
469}
470
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100471#define CS_MAX_STR "Set maximum values for adaptive CS selection (overrides BTS config)\n"
Philipp Maier9459ebd2020-09-29 23:31:33 +0200472DEFUN_ATTR(cfg_pcu_cs_max,
473 cfg_pcu_cs_max_cmd,
474 "cs max <1-4> [<1-4>]",
475 CS_STR
476 CS_MAX_STR
477 "Maximum CS value to be used\n"
478 "Use a different maximum CS value for the uplink",
479 CMD_ATTR_IMMEDIATE)
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200480{
Pau Espin Pedrol343ec9b2020-10-30 18:35:54 +0100481 uint8_t cs_dl = atoi(argv[0]);
482 uint8_t cs_ul;
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200483
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200484 if (argc > 1)
Pau Espin Pedrol343ec9b2020-10-30 18:35:54 +0100485 cs_ul = atoi(argv[1]);
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200486 else
Pau Espin Pedrol343ec9b2020-10-30 18:35:54 +0100487 cs_ul = cs_dl;
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200488
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100489 gprs_pcu_set_max_cs(the_pcu, cs_dl, cs_ul);
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200490 return CMD_SUCCESS;
491}
492
Philipp Maier9459ebd2020-09-29 23:31:33 +0200493DEFUN_ATTR(cfg_pcu_no_cs_max,
494 cfg_pcu_no_cs_max_cmd,
495 "no cs max",
496 NO_STR CS_STR CS_MAX_STR,
497 CMD_ATTR_IMMEDIATE)
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200498{
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100499 gprs_pcu_set_max_cs(the_pcu, 0, 0);
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200500 return CMD_SUCCESS;
501}
502
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100503#define MCS_STR "Modulation and Coding Scheme configuration (EGPRS)\n"
Philipp Maier9459ebd2020-09-29 23:31:33 +0200504DEFUN_ATTR(cfg_pcu_mcs,
505 cfg_pcu_mcs_cmd,
506 "mcs <1-9> [<1-9>]",
507 MCS_STR
508 "Initial MCS value to be used (default 1)\n"
509 "Use a different initial MCS value for the uplink",
510 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +0100511{
512 struct gprs_rlcmac_bts *bts = bts_main_data();
Pau Espin Pedrolb47b1372020-11-03 15:59:39 +0100513 uint8_t mcs = atoi(argv[0]);
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +0100514
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100515 the_pcu->vty.force_initial_mcs = true;
Pau Espin Pedrolb47b1372020-11-03 15:59:39 +0100516 bts->initial_mcs_dl = mcs;
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +0100517 if (argc > 1)
518 bts->initial_mcs_ul = atoi(argv[1]);
519 else
Pau Espin Pedrolb47b1372020-11-03 15:59:39 +0100520 bts->initial_mcs_ul = mcs;
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +0100521
522 return CMD_SUCCESS;
523}
524
Philipp Maier9459ebd2020-09-29 23:31:33 +0200525DEFUN_ATTR(cfg_pcu_no_mcs,
526 cfg_pcu_no_mcs_cmd,
527 "no mcs",
528 NO_STR MCS_STR,
529 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +0100530{
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100531 the_pcu->vty.force_initial_mcs = false;
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +0100532
533 return CMD_SUCCESS;
534}
535
Philipp Maier9459ebd2020-09-29 23:31:33 +0200536DEFUN_ATTR(cfg_pcu_mcs_max,
537 cfg_pcu_mcs_max_cmd,
538 "mcs max <1-9> [<1-9>]",
539 MCS_STR
540 CS_MAX_STR
541 "Maximum MCS value to be used\n"
542 "Use a different maximum MCS value for the uplink",
543 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100544{
Pau Espin Pedrol343ec9b2020-10-30 18:35:54 +0100545 uint8_t mcs_dl = atoi(argv[0]);
546 uint8_t mcs_ul;
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100547
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100548 if (argc > 1)
Pau Espin Pedrol343ec9b2020-10-30 18:35:54 +0100549 mcs_ul = atoi(argv[1]);
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100550 else
Pau Espin Pedrol343ec9b2020-10-30 18:35:54 +0100551 mcs_ul = mcs_dl;
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100552
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100553 gprs_pcu_set_max_mcs(the_pcu, mcs_dl, mcs_ul);
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100554 return CMD_SUCCESS;
555}
556
Philipp Maier9459ebd2020-09-29 23:31:33 +0200557DEFUN_ATTR(cfg_pcu_no_mcs_max,
558 cfg_pcu_no_mcs_max_cmd,
559 "no mcs max",
560 NO_STR MCS_STR CS_MAX_STR,
561 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100562{
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100563 gprs_pcu_set_max_mcs(the_pcu, 0, 0);
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100564 return CMD_SUCCESS;
565}
566
Aravind Sirsikar50b09702016-08-22 17:21:10 +0530567#define DL_STR "downlink specific configuration\n"
568
Philipp Maier9459ebd2020-09-29 23:31:33 +0200569DEFUN_ATTR(cfg_pcu_dl_arq_type,
570 cfg_pcu_dl_arq_cmd,
571 "egprs dl arq-type (spb|arq2)",
572 EGPRS_STR DL_STR "ARQ options\n"
573 "enable SPB(ARQ1) support\n"
574 "enable ARQ2 support",
575 CMD_ATTR_IMMEDIATE)
Aravind Sirsikar50b09702016-08-22 17:21:10 +0530576{
577 struct gprs_rlcmac_bts *bts = bts_main_data();
578
579 if (!strcmp(argv[0], "arq2"))
580 bts->dl_arq_type = 1;
581 else
582 bts->dl_arq_type = 0;
583
584 return CMD_SUCCESS;
585}
586
Philipp Maier9459ebd2020-09-29 23:31:33 +0200587DEFUN_USRATTR(cfg_pcu_window_size,
588 cfg_pcu_window_size_cmd,
589 X(PCU_VTY_ATTR_NEW_TBF),
590 "window-size <0-1024> [<0-256>]",
591 "Window size configuration (b + N_PDCH * f)\n"
592 "Base value (b)\n"
593 "Factor for number of PDCH (f)")
Jacob Erlbeck36df7742016-01-19 15:53:30 +0100594{
595 struct gprs_rlcmac_bts *bts = bts_main_data();
596 uint16_t b = atoi(argv[0]);
597
598 bts->ws_base = b;
599 if (argc > 1) {
600 uint16_t f = atoi(argv[1]);
601 bts->ws_pdch = f;
602 }
603
604 return CMD_SUCCESS;
605}
606
607
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200608#define QUEUE_STR "Packet queue options\n"
609#define LIFETIME_STR "Set lifetime limit of LLC frame in centi-seconds " \
610 "(overrides the value given by SGSN)\n"
611
Philipp Maier9459ebd2020-09-29 23:31:33 +0200612DEFUN_USRATTR(cfg_pcu_queue_lifetime,
613 cfg_pcu_queue_lifetime_cmd,
614 X(PCU_VTY_ATTR_NEW_TBF),
615 "queue lifetime <1-65534>",
616 QUEUE_STR LIFETIME_STR "Lifetime in centi-seconds")
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200617{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200618 struct gprs_rlcmac_bts *bts = bts_main_data();
Jacob Erlbeck2acfbeb2015-04-30 17:55:16 +0200619 uint16_t csec = atoi(argv[0]);
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200620
621 bts->force_llc_lifetime = csec;
622
623 return CMD_SUCCESS;
624}
625
Philipp Maier9459ebd2020-09-29 23:31:33 +0200626DEFUN_USRATTR(cfg_pcu_queue_lifetime_inf,
627 cfg_pcu_queue_lifetime_inf_cmd,
628 X(PCU_VTY_ATTR_NEW_TBF),
629 "queue lifetime infinite",
630 QUEUE_STR LIFETIME_STR "Infinite lifetime")
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200631{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200632 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200633
634 bts->force_llc_lifetime = 0xffff;
635
636 return CMD_SUCCESS;
637}
638
Philipp Maier9459ebd2020-09-29 23:31:33 +0200639DEFUN_USRATTR(cfg_pcu_no_queue_lifetime,
640 cfg_pcu_no_queue_lifetime_cmd,
641 X(PCU_VTY_ATTR_NEW_TBF),
642 "no queue lifetime",
643 NO_STR QUEUE_STR "Disable lifetime limit of LLC frame (use value given "
644 "by SGSN)\n")
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200645{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200646 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200647
648 bts->force_llc_lifetime = 0;
649
650 return CMD_SUCCESS;
651}
652
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100653#define QUEUE_HYSTERESIS_STR "Set lifetime hysteresis of LLC frame in centi-seconds " \
654 "(continue discarding until lifetime-hysteresis is reached)\n"
655
Philipp Maier9459ebd2020-09-29 23:31:33 +0200656DEFUN_USRATTR(cfg_pcu_queue_hysteresis,
657 cfg_pcu_queue_hysteresis_cmd,
658 X(PCU_VTY_ATTR_NEW_TBF),
659 "queue hysteresis <1-65535>",
660 QUEUE_STR QUEUE_HYSTERESIS_STR "Hysteresis in centi-seconds")
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100661{
662 struct gprs_rlcmac_bts *bts = bts_main_data();
Jacob Erlbeck2acfbeb2015-04-30 17:55:16 +0200663 uint16_t csec = atoi(argv[0]);
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100664
665 bts->llc_discard_csec = csec;
666
667 return CMD_SUCCESS;
668}
669
Philipp Maier9459ebd2020-09-29 23:31:33 +0200670DEFUN_USRATTR(cfg_pcu_no_queue_hysteresis,
671 cfg_pcu_no_queue_hysteresis_cmd,
672 X(PCU_VTY_ATTR_NEW_TBF),
673 "no queue hysteresis",
674 NO_STR QUEUE_STR QUEUE_HYSTERESIS_STR)
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100675{
676 struct gprs_rlcmac_bts *bts = bts_main_data();
677
678 bts->llc_discard_csec = 0;
679
680 return CMD_SUCCESS;
681}
682
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200683#define QUEUE_CODEL_STR "Set CoDel queue management\n"
Philipp Maier9459ebd2020-09-29 23:31:33 +0200684DEFUN_USRATTR(cfg_pcu_queue_codel,
685 cfg_pcu_queue_codel_cmd,
686 X(PCU_VTY_ATTR_NEW_SUBSCR),
687 "queue codel",
688 QUEUE_STR QUEUE_CODEL_STR)
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200689{
690 struct gprs_rlcmac_bts *bts = bts_main_data();
691
692 bts->llc_codel_interval_msec = LLC_CODEL_USE_DEFAULT;
693
694 return CMD_SUCCESS;
695}
696
Philipp Maier9459ebd2020-09-29 23:31:33 +0200697DEFUN_USRATTR(cfg_pcu_queue_codel_interval,
698 cfg_pcu_queue_codel_interval_cmd,
699 X(PCU_VTY_ATTR_NEW_SUBSCR),
700 "queue codel interval <1-1000>",
701 QUEUE_STR QUEUE_CODEL_STR "Specify interval\n" "Interval in centi-seconds")
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200702{
703 struct gprs_rlcmac_bts *bts = bts_main_data();
704 uint16_t csec = atoi(argv[0]);
705
706 bts->llc_codel_interval_msec = 10*csec;
707
708 return CMD_SUCCESS;
709}
710
Philipp Maier9459ebd2020-09-29 23:31:33 +0200711DEFUN_USRATTR(cfg_pcu_no_queue_codel,
712 cfg_pcu_no_queue_codel_cmd,
713 X(PCU_VTY_ATTR_NEW_SUBSCR),
714 "no queue codel",
715 NO_STR QUEUE_STR QUEUE_CODEL_STR)
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200716{
717 struct gprs_rlcmac_bts *bts = bts_main_data();
718
719 bts->llc_codel_interval_msec = LLC_CODEL_DISABLE;
720
721 return CMD_SUCCESS;
722}
723
724
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200725#define QUEUE_IDLE_ACK_STR "Request an ACK after the last DL LLC frame in centi-seconds\n"
726
Philipp Maier9459ebd2020-09-29 23:31:33 +0200727DEFUN_ATTR(cfg_pcu_queue_idle_ack_delay,
728 cfg_pcu_queue_idle_ack_delay_cmd,
729 "queue idle-ack-delay <1-65535>",
730 QUEUE_STR QUEUE_IDLE_ACK_STR "Idle ACK delay in centi-seconds",
731 CMD_ATTR_IMMEDIATE)
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200732{
733 struct gprs_rlcmac_bts *bts = bts_main_data();
Jacob Erlbeck2acfbeb2015-04-30 17:55:16 +0200734 uint16_t csec = atoi(argv[0]);
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200735
736 bts->llc_idle_ack_csec = csec;
737
738 return CMD_SUCCESS;
739}
740
Philipp Maier9459ebd2020-09-29 23:31:33 +0200741DEFUN_ATTR(cfg_pcu_no_queue_idle_ack_delay,
742 cfg_pcu_no_queue_idle_ack_delay_cmd,
743 "no queue idle-ack-delay",
744 NO_STR QUEUE_STR QUEUE_IDLE_ACK_STR,
745 CMD_ATTR_IMMEDIATE)
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200746{
747 struct gprs_rlcmac_bts *bts = bts_main_data();
748
749 bts->llc_idle_ack_csec = 0;
750
751 return CMD_SUCCESS;
752}
753
Philipp Maier9459ebd2020-09-29 23:31:33 +0200754DEFUN_ATTR(cfg_pcu_alloc,
755 cfg_pcu_alloc_cmd,
756 "alloc-algorithm (a|b|dynamic)",
757 "Select slot allocation algorithm to use when assigning timeslots on "
758 "PACCH\n"
759 "Single slot is assigned only\n"
760 "Multiple slots are assigned for semi-duplex operation\n"
761 "Dynamically select the algorithm based on the system state\n",
762 CMD_ATTR_IMMEDIATE)
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200763{
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200764 switch (argv[0][0]) {
765 case 'a':
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100766 the_pcu->alloc_algorithm = alloc_algorithm_a;
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200767 break;
768 case 'b':
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100769 the_pcu->alloc_algorithm = alloc_algorithm_b;
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200770 break;
Jacob Erlbeck400ec022015-07-14 13:31:48 +0200771 default:
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100772 the_pcu->alloc_algorithm = alloc_algorithm_dynamic;
Jacob Erlbeck400ec022015-07-14 13:31:48 +0200773 break;
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200774 }
775
776 return CMD_SUCCESS;
777}
778
Philipp Maier9459ebd2020-09-29 23:31:33 +0200779DEFUN_ATTR(cfg_pcu_two_phase,
780 cfg_pcu_two_phase_cmd,
781 "two-phase-access",
782 "Force two phase access when MS requests single phase access\n",
783 CMD_ATTR_IMMEDIATE)
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200784{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200785 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200786
787 bts->force_two_phase = 1;
788
789 return CMD_SUCCESS;
790}
791
Philipp Maier9459ebd2020-09-29 23:31:33 +0200792DEFUN_ATTR(cfg_pcu_no_two_phase,
793 cfg_pcu_no_two_phase_cmd,
794 "no two-phase-access",
795 NO_STR "Only use two phase access when requested my MS\n",
796 CMD_ATTR_IMMEDIATE)
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200797{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200798 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200799
800 bts->force_two_phase = 0;
801
802 return CMD_SUCCESS;
803}
804
Philipp Maier9459ebd2020-09-29 23:31:33 +0200805DEFUN_ATTR(cfg_pcu_alpha,
806 cfg_pcu_alpha_cmd,
807 "alpha <0-10>",
808 "Alpha parameter for MS power control in units of 0.1 (see TS 05.08) "
809 "NOTE: Be sure to set Alpha value at System information 13 too.\n"
810 "Alpha in units of 0.1\n",
811 CMD_ATTR_IMMEDIATE)
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200812{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200813 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200814
815 bts->alpha = atoi(argv[0]);
816
817 return CMD_SUCCESS;
818}
819
Philipp Maier9459ebd2020-09-29 23:31:33 +0200820DEFUN_ATTR(cfg_pcu_gamma,
821 cfg_pcu_gamma_cmd,
822 "gamma <0-62>",
823 "Gamma parameter for MS power control in units of dB (see TS 05.08)\n"
824 "Gamma in even unit of dBs\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->gamma = atoi(argv[0]) / 2;
830
831 return CMD_SUCCESS;
832}
833
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +0100834DEFUN(show_bts_stats,
835 show_bts_stats_cmd,
836 "show bts statistics",
837 SHOW_STR "BTS related functionality\nStatistics\n")
838{
839 vty_out_rate_ctr_group(vty, "", bts_main_data_stats());
840 return CMD_SUCCESS;
Daniel Willmann772415f2014-01-15 17:06:51 +0100841}
842
Pau Espin Pedrola1ac2f02020-09-22 17:01:31 +0200843DEFUN(show_bts_pdch,
844 show_bts_pdch_cmd,
845 "show bts pdch",
846 SHOW_STR "BTS related functionality\nPDCH timeslots\n")
847{
848 return pcu_vty_show_bts_pdch(vty, bts_main_data());
849}
850
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100851#define IDLE_TIME_STR "keep an idle DL TBF alive for the time given\n"
Pau Espin Pedrol2b5c6292019-09-09 13:41:00 +0200852DEFUN_DEPRECATED(cfg_pcu_dl_tbf_idle_time,
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100853 cfg_pcu_dl_tbf_idle_time_cmd,
854 "dl-tbf-idle-time <1-5000>",
855 IDLE_TIME_STR "idle time in msec")
856{
Pau Espin Pedrol2b5c6292019-09-09 13:41:00 +0200857 vty_out(vty, "%% 'dl-tbf-idle-time' is now deprecated: use 'timer X2031 <val>' instead%s", VTY_NEWLINE);
858
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100859 struct gprs_rlcmac_bts *bts = bts_main_data();
860
Pau Espin Pedrol2b5c6292019-09-09 13:41:00 +0200861 if (osmo_tdef_set(bts->T_defs_pcu, -2031, atoi(argv[0]), OSMO_TDEF_MS) < 0)
862 return CMD_WARNING;
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100863 return CMD_SUCCESS;
864}
865
Pau Espin Pedrol2b5c6292019-09-09 13:41:00 +0200866DEFUN_DEPRECATED(cfg_pcu_no_dl_tbf_idle_time,
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100867 cfg_pcu_no_dl_tbf_idle_time_cmd,
868 "no dl-tbf-idle-time",
869 NO_STR IDLE_TIME_STR)
870{
Pau Espin Pedrol2b5c6292019-09-09 13:41:00 +0200871 vty_out(vty, "%% 'no dl-tbf-idle-time' is now deprecated: use 'timer X2031 0' 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, 0, OSMO_TDEF_MS) < 0)
876 return CMD_WARNING;
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100877 return CMD_SUCCESS;
878}
879
Oliver Smith45fdc442019-09-05 15:12:20 +0200880#define RETRANSMISSION_STR "retransmit blocks even before the MS had a chance to receive them (better throughput," \
881 " less readable traces)"
Philipp Maier9459ebd2020-09-29 23:31:33 +0200882DEFUN_ATTR(cfg_pcu_dl_tbf_preemptive_retransmission,
883 cfg_pcu_dl_tbf_preemptive_retransmission_cmd,
884 "dl-tbf-preemptive-retransmission",
885 RETRANSMISSION_STR " (enabled by default)",
886 CMD_ATTR_IMMEDIATE)
Oliver Smith45fdc442019-09-05 15:12:20 +0200887{
888 struct gprs_rlcmac_bts *bts = bts_main_data();
889
890 bts->dl_tbf_preemptive_retransmission = true;
891
892 return CMD_SUCCESS;
893}
894
Philipp Maier9459ebd2020-09-29 23:31:33 +0200895DEFUN_ATTR(cfg_pcu_no_dl_tbf_preemptive_retransmission,
896 cfg_pcu_no_dl_tbf_preemptive_retransmission_cmd,
897 "no dl-tbf-preemptive-retransmission",
898 NO_STR RETRANSMISSION_STR,
899 CMD_ATTR_IMMEDIATE)
Oliver Smith45fdc442019-09-05 15:12:20 +0200900{
901 struct gprs_rlcmac_bts *bts = bts_main_data();
902
903 bts->dl_tbf_preemptive_retransmission = false;
904
905 return CMD_SUCCESS;
906}
907
Jacob Erlbecka098c192015-05-28 16:11:19 +0200908#define MS_IDLE_TIME_STR "keep an idle MS object alive for the time given\n"
Pau Espin Pedrol63700ea2019-09-09 13:19:06 +0200909DEFUN_DEPRECATED(cfg_pcu_ms_idle_time,
Jacob Erlbecka098c192015-05-28 16:11:19 +0200910 cfg_pcu_ms_idle_time_cmd,
911 "ms-idle-time <1-7200>",
912 MS_IDLE_TIME_STR "idle time in sec")
913{
Pau Espin Pedrol63700ea2019-09-09 13:19:06 +0200914 vty_out(vty, "%% 'ms-idle-time' is now deprecated: use 'timer X2030 <val>' instead%s", VTY_NEWLINE);
915
Jacob Erlbecka098c192015-05-28 16:11:19 +0200916 struct gprs_rlcmac_bts *bts = bts_main_data();
917
Pau Espin Pedrol63700ea2019-09-09 13:19:06 +0200918 if (osmo_tdef_set(bts->T_defs_pcu, -2030, atoi(argv[0]), OSMO_TDEF_S) < 0)
919 return CMD_WARNING;
Jacob Erlbecka098c192015-05-28 16:11:19 +0200920 return CMD_SUCCESS;
921}
922
Pau Espin Pedrol63700ea2019-09-09 13:19:06 +0200923DEFUN_DEPRECATED(cfg_pcu_no_ms_idle_time,
Jacob Erlbecka098c192015-05-28 16:11:19 +0200924 cfg_pcu_no_ms_idle_time_cmd,
925 "no ms-idle-time",
926 NO_STR MS_IDLE_TIME_STR)
927{
Pau Espin Pedrol63700ea2019-09-09 13:19:06 +0200928 vty_out(vty, "%% 'no ms-idle-time' is now deprecated: use 'timer X2030 0' 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, 0, OSMO_TDEF_S) < 0)
933 return CMD_WARNING;
Jacob Erlbecka098c192015-05-28 16:11:19 +0200934 return CMD_SUCCESS;
935}
936
Pau Espin Pedrol1e6eb302019-11-28 17:00:44 +0100937#define CS_ERR_LIMITS_STR "set thresholds for error rate based downlink (M)CS adjustment\n"
Philipp Maier9459ebd2020-09-29 23:31:33 +0200938DEFUN_ATTR(cfg_pcu_cs_err_limits,
939 cfg_pcu_cs_err_limits_cmd,
940 "cs threshold <0-100> <0-100>",
941 CS_STR CS_ERR_LIMITS_STR "lower limit in %\n" "upper limit in %\n",
942 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200943{
944 struct gprs_rlcmac_bts *bts = bts_main_data();
945
946 uint8_t lower_limit = atoi(argv[0]);
947 uint8_t upper_limit = atoi(argv[1]);
948
949 if (lower_limit > upper_limit) {
950 vty_out(vty,
951 "The lower limit must be less than or equal to the "
952 "upper limit.%s", VTY_NEWLINE);
953 return CMD_WARNING;
954 }
955
956 bts->cs_adj_enabled = 1;
957 bts->cs_adj_upper_limit = upper_limit;
958 bts->cs_adj_lower_limit = lower_limit;
959
960 return CMD_SUCCESS;
961}
962
Philipp Maier9459ebd2020-09-29 23:31:33 +0200963DEFUN_ATTR(cfg_pcu_no_cs_err_limits,
964 cfg_pcu_no_cs_err_limits_cmd,
965 "no cs threshold",
966 NO_STR CS_STR CS_ERR_LIMITS_STR,
967 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200968{
969 struct gprs_rlcmac_bts *bts = bts_main_data();
970
971 bts->cs_adj_enabled = 0;
972 bts->cs_adj_upper_limit = 100;
973 bts->cs_adj_lower_limit = 0;
974
975 return CMD_SUCCESS;
976}
977
Pau Espin Pedrol1e6eb302019-11-28 17:00:44 +0100978#define CS_DOWNGRADE_STR "set threshold for data size based downlink (M)CS downgrade\n"
Philipp Maier9459ebd2020-09-29 23:31:33 +0200979DEFUN_ATTR(cfg_pcu_cs_downgrade_thrsh,
980 cfg_pcu_cs_downgrade_thrsh_cmd,
981 "cs downgrade-threshold <1-10000>",
982 CS_STR CS_DOWNGRADE_STR "downgrade if less octets left\n",
983 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +0200984{
985 struct gprs_rlcmac_bts *bts = bts_main_data();
986
987 bts->cs_downgrade_threshold = atoi(argv[0]);
988
989 return CMD_SUCCESS;
990}
991
Philipp Maier9459ebd2020-09-29 23:31:33 +0200992DEFUN_ATTR(cfg_pcu_no_cs_downgrade_thrsh,
993 cfg_pcu_no_cs_downgrade_thrsh_cmd,
994 "no cs downgrade-threshold",
995 NO_STR CS_STR CS_DOWNGRADE_STR,
996 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +0200997{
998 struct gprs_rlcmac_bts *bts = bts_main_data();
999
1000 bts->cs_downgrade_threshold = 0;
1001
1002 return CMD_SUCCESS;
1003}
1004
Philipp Maier9459ebd2020-09-29 23:31:33 +02001005DEFUN_ATTR(cfg_pcu_cs_lqual_ranges,
1006 cfg_pcu_cs_lqual_ranges_cmd,
1007 "cs link-quality-ranges cs1 <0-35> cs2 <0-35> <0-35> cs3 <0-35> <0-35> cs4 <0-35>",
1008 CS_STR "Set link quality ranges for each uplink CS\n"
1009 "Set quality range for CS-1 (high value only)\n"
1010 "CS-1 high (dB)\n"
1011 "Set quality range for CS-2\n"
1012 "CS-2 low (dB)\n"
1013 "CS-2 high (dB)\n"
1014 "Set quality range for CS-3\n"
1015 "CS-3 low (dB)\n"
1016 "CS-3 high (dB)\n"
1017 "Set quality range for CS-4 (low value only)\n"
1018 "CS-4 low (dB)\n",
1019 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck94cde132015-06-09 09:44:36 +02001020{
1021 struct gprs_rlcmac_bts *bts = bts_main_data();
1022
1023 uint8_t cs1_high = atoi(argv[0]);
1024 uint8_t cs2_low = atoi(argv[1]);
1025 uint8_t cs2_high = atoi(argv[2]);
1026 uint8_t cs3_low = atoi(argv[3]);
1027 uint8_t cs3_high = atoi(argv[4]);
1028 uint8_t cs4_low = atoi(argv[5]);
1029
1030 bts->cs_lqual_ranges[0].high = cs1_high;
1031 bts->cs_lqual_ranges[1].low = cs2_low;
1032 bts->cs_lqual_ranges[1].high = cs2_high;
1033 bts->cs_lqual_ranges[2].low = cs3_low;
1034 bts->cs_lqual_ranges[2].high = cs3_high;
1035 bts->cs_lqual_ranges[3].low = cs4_low;
1036
1037 return CMD_SUCCESS;
1038}
1039
Philipp Maier9459ebd2020-09-29 23:31:33 +02001040DEFUN_ATTR(cfg_pcu_mcs_lqual_ranges,
1041 cfg_pcu_mcs_lqual_ranges_cmd,
1042 "mcs link-quality-ranges mcs1 <0-35> mcs2 <0-35> <0-35> mcs3 <0-35> <0-35> mcs4 <0-35> <0-35> mcs5 <0-35> <0-35> mcs6 <0-35> <0-35> mcs7 <0-35> <0-35> mcs8 <0-35> <0-35> mcs9 <0-35>",
1043 CS_STR "Set link quality ranges for each uplink MCS\n"
1044 "Set quality range for MCS-1 (high value only)\n"
1045 "MCS-1 high (dB)\n"
1046 "Set quality range for MCS-2\n"
1047 "MCS-2 high (dB)\n"
1048 "MCS-2 low (dB)\n"
1049 "Set quality range for MCS-3\n"
1050 "MCS-3 high (dB)\n"
1051 "MCS-3 low (dB)\n"
1052 "Set quality range for MCS-4\n"
1053 "MCS-4 high (dB)\n"
1054 "MCS-4 low (dB)\n"
1055 "Set quality range for MCS-5\n"
1056 "MCS-5 high (dB)\n"
1057 "MCS-5 low (dB)\n"
1058 "Set quality range for MCS-6\n"
1059 "MCS-6 low (dB)\n"
1060 "MCS-6 high (dB)\n"
1061 "Set quality range for MCS-7\n"
1062 "MCS-7 low (dB)\n"
1063 "MCS-7 high (dB)\n"
1064 "Set quality range for MCS-8\n"
1065 "MCS-8 low (dB)\n"
1066 "MCS-8 high (dB)\n"
1067 "Set quality range for MCS-9 (low value only)\n"
1068 "MCS-9 low (dB)\n",
1069 CMD_ATTR_IMMEDIATE)
Minh-Quang Nguyen1f189092017-08-16 09:50:06 -04001070{
1071 struct gprs_rlcmac_bts *bts = bts_main_data();
1072
1073 bts->mcs_lqual_ranges[0].high = atoi(argv[0]);
1074 bts->mcs_lqual_ranges[1].low = atoi(argv[1]);
1075 bts->mcs_lqual_ranges[1].high = atoi(argv[2]);
1076 bts->mcs_lqual_ranges[2].low = atoi(argv[3]);
1077 bts->mcs_lqual_ranges[2].high = atoi(argv[4]);
1078 bts->mcs_lqual_ranges[3].low = atoi(argv[5]);
1079 bts->mcs_lqual_ranges[3].high = atoi(argv[6]);
1080 bts->mcs_lqual_ranges[4].low = atoi(argv[7]);
1081 bts->mcs_lqual_ranges[4].high = atoi(argv[8]);
1082 bts->mcs_lqual_ranges[5].low = atoi(argv[9]);
1083 bts->mcs_lqual_ranges[5].high = atoi(argv[10]);
1084 bts->mcs_lqual_ranges[6].low = atoi(argv[11]);
1085 bts->mcs_lqual_ranges[6].high = atoi(argv[12]);
1086 bts->mcs_lqual_ranges[7].low = atoi(argv[13]);
1087 bts->mcs_lqual_ranges[7].high = atoi(argv[14]);
1088 bts->mcs_lqual_ranges[8].low = atoi(argv[15]);
1089
1090 return CMD_SUCCESS;
1091}
1092
Pau Espin Pedrolc4178e52017-08-08 15:03:50 +02001093DEFUN(cfg_pcu_sock,
1094 cfg_pcu_sock_cmd,
1095 "pcu-socket PATH",
1096 "Configure the osmo-bts PCU socket file/path name\n"
1097 "Path of the socket to connect to\n")
1098{
Vadim Yanitskiyfc75cc02019-11-30 20:13:25 +07001099 if (vty->type != VTY_FILE)
1100 vty_out(vty, "Changing PCU socket path at run-time has no effect%s", VTY_NEWLINE);
1101
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +01001102 osmo_talloc_replace_string(tall_pcu_ctx, &the_pcu->pcu_sock_path, argv[0]);
Pau Espin Pedrolc4178e52017-08-08 15:03:50 +02001103
1104 return CMD_SUCCESS;
1105}
Jacob Erlbeck94cde132015-06-09 09:44:36 +02001106
Philipp Maier9459ebd2020-09-29 23:31:33 +02001107DEFUN_USRATTR(cfg_pcu_gb_dialect,
1108 cfg_pcu_gb_dialect_cmd,
1109 X(PCU_VTY_ATTR_NS_RESET),
1110 "gb-dialect (classic|ip-sns)",
1111 "Select which Gb interface dialect to use\n"
1112 "Classic Gb interface with NS-{RESET,BLOCK,UNBLOCK} and static configuration\n"
1113 "Modern Gb interface with IP-SNS (Sub Network Service) and dynamic configuration\n")
Harald Welte57d35152018-07-05 03:11:17 +02001114{
1115 struct gprs_rlcmac_bts *bts = bts_main_data();
1116
Alexander Couzens290d9032020-09-16 21:52:02 +02001117 if (!strcmp(argv[0], "ip-sns")) {
Alexander Couzens5012e072020-12-06 01:23:51 +01001118 bts->ns_dialect = NS2_DIALECT_SNS;
Alexander Couzens290d9032020-09-16 21:52:02 +02001119 } else {
Alexander Couzens5012e072020-12-06 01:23:51 +01001120 bts->ns_dialect = NS2_DIALECT_IPACCESS;
Alexander Couzens290d9032020-09-16 21:52:02 +02001121 }
Harald Welte57d35152018-07-05 03:11:17 +02001122
1123 return CMD_SUCCESS;
1124}
1125
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +02001126DEFUN(show_bts_timer, show_bts_timer_cmd,
1127 "show bts-timer " OSMO_TDEF_VTY_ARG_T_OPTIONAL,
1128 SHOW_STR "Show BTS controlled timers\n"
1129 OSMO_TDEF_VTY_DOC_T)
1130{
1131 struct gprs_rlcmac_bts *bts = bts_main_data();
1132 const char *T_arg = argc > 0 ? argv[0] : NULL;
1133 return osmo_tdef_vty_show_cmd(vty, bts->T_defs_bts, T_arg, NULL);
1134}
1135
1136DEFUN(show_timer, show_timer_cmd,
1137 "show timer " OSMO_TDEF_VTY_ARG_T_OPTIONAL,
1138 SHOW_STR "Show PCU timers\n"
1139 OSMO_TDEF_VTY_DOC_T)
1140{
1141 struct gprs_rlcmac_bts *bts = bts_main_data();
1142 const char *T_arg = argc > 0 ? argv[0] : NULL;
1143 return osmo_tdef_vty_show_cmd(vty, bts->T_defs_pcu, T_arg, NULL);
1144}
1145
Philipp Maier9459ebd2020-09-29 23:31:33 +02001146DEFUN_ATTR(cfg_pcu_timer, cfg_pcu_timer_cmd,
1147 "timer " OSMO_TDEF_VTY_ARG_SET_OPTIONAL,
1148 "Configure or show PCU timers\n"
1149 OSMO_TDEF_VTY_DOC_SET,
1150 CMD_ATTR_IMMEDIATE)
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +02001151{
1152 struct gprs_rlcmac_bts *bts = bts_main_data();
1153 /* If any arguments are missing, redirect to 'show' */
1154 if (argc < 2)
1155 return show_timer(self, vty, argc, argv);
1156 return osmo_tdef_vty_set_cmd(vty, bts->T_defs_pcu, argv);
1157}
1158
Daniel Willmann772415f2014-01-15 17:06:51 +01001159DEFUN(show_tbf,
1160 show_tbf_cmd,
Max12a09872018-02-01 16:07:33 +01001161 "show tbf (all|ccch|pacch)",
1162 SHOW_STR "information about TBFs\n"
1163 "All TBFs\n"
1164 "TBFs allocated via CCCH\n"
1165 "TBFs allocated via PACCH\n")
Daniel Willmann772415f2014-01-15 17:06:51 +01001166{
1167 struct gprs_rlcmac_bts *bts = bts_main_data();
Vadim Yanitskiycef2f842019-10-09 21:52:50 +07001168 uint32_t flags = UINT32_MAX;
Max12a09872018-02-01 16:07:33 +01001169
Vadim Yanitskiycef2f842019-10-09 21:52:50 +07001170 if (argv[0][0] == 'c')
1171 flags = (1 << GPRS_RLCMAC_FLAG_CCCH);
1172 else if (argv[0][0] == 'p')
1173 flags = (1 << GPRS_RLCMAC_FLAG_PACCH);
Max12a09872018-02-01 16:07:33 +01001174
Vadim Yanitskiycef2f842019-10-09 21:52:50 +07001175 return pcu_vty_show_tbf_all(vty, bts, flags);
Daniel Willmann772415f2014-01-15 17:06:51 +01001176}
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +01001177
Jacob Erlbeckf47f68a2015-06-04 10:23:24 +02001178DEFUN(show_ms_all,
1179 show_ms_all_cmd,
1180 "show ms all",
1181 SHOW_STR "information about MSs\n" "All TBFs\n")
1182{
1183 struct gprs_rlcmac_bts *bts = bts_main_data();
1184 return pcu_vty_show_ms_all(vty, bts);
1185}
1186
Jacob Erlbeck37e896d2015-06-05 16:33:33 +02001187DEFUN(show_ms_tlli,
1188 show_ms_tlli_cmd,
1189 "show ms tlli TLLI",
1190 SHOW_STR "information about MSs\n" "Select MS by TLLI\n" "TLLI as hex\n")
1191{
1192 struct gprs_rlcmac_bts *bts = bts_main_data();
1193 char *endp = NULL;
1194 unsigned long long tlli = strtoll(argv[0], &endp, 16);
1195 if ((endp != NULL && *endp != 0) || tlli > 0xffffffffULL) {
1196 vty_out(vty, "Invalid TLLI.%s", VTY_NEWLINE);
1197 return CMD_WARNING;
1198 }
1199 return pcu_vty_show_ms_by_tlli(vty, bts, (uint32_t)tlli);
1200}
1201
1202DEFUN(show_ms_imsi,
1203 show_ms_imsi_cmd,
1204 "show ms imsi IMSI",
1205 SHOW_STR "information about MSs\n" "Select MS by IMSI\n" "IMSI\n")
1206{
1207 struct gprs_rlcmac_bts *bts = bts_main_data();
1208 return pcu_vty_show_ms_by_imsi(vty, bts, argv[0]);
1209}
1210
Andreas Eversberg12942562012-07-12 14:31:57 +02001211static const char pcu_copyright[] =
Harald Welted1e340f2013-01-17 12:24:29 +01001212 "Copyright (C) 2012 by Ivan Kluchnikov <kluchnikovi@gmail.com> and \r\n"
1213 " Andreas Eversberg <jolly@eversberg.eu>\r\n"
Andreas Eversberg12942562012-07-12 14:31:57 +02001214 "License GNU GPL version 2 or later\r\n"
1215 "This is free software: you are free to change and redistribute it.\r\n"
1216 "There is NO WARRANTY, to the extent permitted by law.\r\n";
1217
1218struct vty_app_info pcu_vty_info = {
Pau Espin Pedrold0fc9e82019-11-29 13:37:45 +01001219 .name = "OsmoPCU",
Andreas Eversberg12942562012-07-12 14:31:57 +02001220 .version = PACKAGE_VERSION,
1221 .copyright = pcu_copyright,
Philipp Maier9459ebd2020-09-29 23:31:33 +02001222 .usr_attr_desc = {
1223 [PCU_VTY_ATTR_NEW_TBF] = \
1224 "This command applies when a new TBF is begins",
1225 [PCU_VTY_ATTR_NEW_SUBSCR] = \
1226 "This command applies when a new subscriber attaches",
1227 [PCU_VTY_ATTR_NS_RESET] = \
1228 "This command applies when the NS is reset",
1229 },
1230 .usr_attr_letters = {
1231 [PCU_VTY_ATTR_NEW_TBF] = 'n',
1232 [PCU_VTY_ATTR_NEW_SUBSCR] = 's',
1233 [PCU_VTY_ATTR_NS_RESET] = 'r',
1234 },
Andreas Eversberg12942562012-07-12 14:31:57 +02001235};
1236
Pau Espin Pedrolcd2ac562019-08-05 14:30:44 +02001237int pcu_vty_init(void)
Andreas Eversberg12942562012-07-12 14:31:57 +02001238{
1239// install_element_ve(&show_pcu_cmd);
1240
Harald Welte717cdf52017-07-21 21:56:23 +02001241 cfg_pcu_gsmtap_categ_cmd.string = vty_cmd_string_from_valstr(tall_pcu_ctx, pcu_gsmtap_categ_names,
1242 "gsmtap-category (",
1243 "|",")", VTY_DO_LOWER);
1244 cfg_pcu_gsmtap_categ_cmd.doc = vty_cmd_string_from_valstr(tall_pcu_ctx, pcu_gsmtap_categ_help,
1245 "GSMTAP Category\n",
1246 "\n", "", 0);
1247 cfg_pcu_no_gsmtap_categ_cmd.string = vty_cmd_string_from_valstr(tall_pcu_ctx, pcu_gsmtap_categ_names,
1248 "no gsmtap-category (",
1249 "|",")", VTY_DO_LOWER);
1250 cfg_pcu_no_gsmtap_categ_cmd.doc = vty_cmd_string_from_valstr(tall_pcu_ctx, pcu_gsmtap_categ_help,
1251 NO_STR "GSMTAP Category\n",
1252 "\n", "", 0);
1253
Pau Espin Pedrolcd2ac562019-08-05 14:30:44 +02001254 logging_vty_add_cmds();
1255 osmo_stats_vty_add_cmds();
Vadim Yanitskiyd83c8ff2020-02-06 16:46:17 +07001256 osmo_talloc_vty_add_cmds();
Andreas Eversberg12942562012-07-12 14:31:57 +02001257
Andreas Eversberg8b761a32012-07-20 21:50:31 +02001258 install_node(&pcu_node, config_write_pcu);
1259 install_element(CONFIG_NODE, &cfg_pcu_cmd);
Jacob Erlbeck953c7892015-09-28 18:12:57 +02001260 install_element(PCU_NODE, &cfg_pcu_egprs_cmd);
1261 install_element(PCU_NODE, &cfg_pcu_no_egprs_cmd);
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +02001262 install_element(PCU_NODE, &cfg_pcu_no_two_phase_cmd);
Andreas Eversberg8b761a32012-07-20 21:50:31 +02001263 install_element(PCU_NODE, &cfg_pcu_cs_cmd);
1264 install_element(PCU_NODE, &cfg_pcu_no_cs_cmd);
Jacob Erlbeckb33e6752015-06-04 19:04:30 +02001265 install_element(PCU_NODE, &cfg_pcu_cs_max_cmd);
1266 install_element(PCU_NODE, &cfg_pcu_no_cs_max_cmd);
Jacob Erlbeck8322d082015-06-04 15:12:10 +02001267 install_element(PCU_NODE, &cfg_pcu_cs_err_limits_cmd);
1268 install_element(PCU_NODE, &cfg_pcu_no_cs_err_limits_cmd);
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +02001269 install_element(PCU_NODE, &cfg_pcu_cs_downgrade_thrsh_cmd);
1270 install_element(PCU_NODE, &cfg_pcu_no_cs_downgrade_thrsh_cmd);
Jacob Erlbeck94cde132015-06-09 09:44:36 +02001271 install_element(PCU_NODE, &cfg_pcu_cs_lqual_ranges_cmd);
Minh-Quang Nguyen1f189092017-08-16 09:50:06 -04001272 install_element(PCU_NODE, &cfg_pcu_mcs_lqual_ranges_cmd);
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +01001273 install_element(PCU_NODE, &cfg_pcu_mcs_cmd);
Aravind Sirsikar50b09702016-08-22 17:21:10 +05301274 install_element(PCU_NODE, &cfg_pcu_dl_arq_cmd);
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +01001275 install_element(PCU_NODE, &cfg_pcu_no_mcs_cmd);
Jacob Erlbeck0d058052016-01-07 11:48:28 +01001276 install_element(PCU_NODE, &cfg_pcu_mcs_max_cmd);
1277 install_element(PCU_NODE, &cfg_pcu_no_mcs_max_cmd);
Jacob Erlbeck36df7742016-01-19 15:53:30 +01001278 install_element(PCU_NODE, &cfg_pcu_window_size_cmd);
Andreas Eversberg24131bf2012-07-21 11:09:58 +02001279 install_element(PCU_NODE, &cfg_pcu_queue_lifetime_cmd);
1280 install_element(PCU_NODE, &cfg_pcu_queue_lifetime_inf_cmd);
1281 install_element(PCU_NODE, &cfg_pcu_no_queue_lifetime_cmd);
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +01001282 install_element(PCU_NODE, &cfg_pcu_queue_hysteresis_cmd);
1283 install_element(PCU_NODE, &cfg_pcu_no_queue_hysteresis_cmd);
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +02001284 install_element(PCU_NODE, &cfg_pcu_queue_codel_cmd);
1285 install_element(PCU_NODE, &cfg_pcu_queue_codel_interval_cmd);
1286 install_element(PCU_NODE, &cfg_pcu_no_queue_codel_cmd);
Jacob Erlbeckd0261b72015-04-02 13:58:09 +02001287 install_element(PCU_NODE, &cfg_pcu_queue_idle_ack_delay_cmd);
1288 install_element(PCU_NODE, &cfg_pcu_no_queue_idle_ack_delay_cmd);
Andreas Eversberga1503fa2012-07-22 08:58:09 +02001289 install_element(PCU_NODE, &cfg_pcu_alloc_cmd);
Andreas Eversberg07e97cf2012-08-07 16:00:56 +02001290 install_element(PCU_NODE, &cfg_pcu_two_phase_cmd);
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +02001291 install_element(PCU_NODE, &cfg_pcu_fc_interval_cmd);
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +02001292 install_element(PCU_NODE, &cfg_pcu_fc_bucket_time_cmd);
1293 install_element(PCU_NODE, &cfg_pcu_no_fc_bucket_time_cmd);
Jacob Erlbeck87d73412015-04-21 12:56:48 +02001294 install_element(PCU_NODE, &cfg_pcu_fc_bvc_bucket_size_cmd);
1295 install_element(PCU_NODE, &cfg_pcu_no_fc_bvc_bucket_size_cmd);
1296 install_element(PCU_NODE, &cfg_pcu_fc_bvc_leak_rate_cmd);
1297 install_element(PCU_NODE, &cfg_pcu_no_fc_bvc_leak_rate_cmd);
1298 install_element(PCU_NODE, &cfg_pcu_fc_ms_bucket_size_cmd);
1299 install_element(PCU_NODE, &cfg_pcu_no_fc_ms_bucket_size_cmd);
1300 install_element(PCU_NODE, &cfg_pcu_fc_ms_leak_rate_cmd);
1301 install_element(PCU_NODE, &cfg_pcu_no_fc_ms_leak_rate_cmd);
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +02001302 install_element(PCU_NODE, &cfg_pcu_alpha_cmd);
1303 install_element(PCU_NODE, &cfg_pcu_gamma_cmd);
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +01001304 install_element(PCU_NODE, &cfg_pcu_dl_tbf_idle_time_cmd);
1305 install_element(PCU_NODE, &cfg_pcu_no_dl_tbf_idle_time_cmd);
Oliver Smith45fdc442019-09-05 15:12:20 +02001306 install_element(PCU_NODE, &cfg_pcu_dl_tbf_preemptive_retransmission_cmd);
1307 install_element(PCU_NODE, &cfg_pcu_no_dl_tbf_preemptive_retransmission_cmd);
Jacob Erlbecka098c192015-05-28 16:11:19 +02001308 install_element(PCU_NODE, &cfg_pcu_ms_idle_time_cmd);
1309 install_element(PCU_NODE, &cfg_pcu_no_ms_idle_time_cmd);
Harald Welte717cdf52017-07-21 21:56:23 +02001310 install_element(PCU_NODE, &cfg_pcu_gsmtap_categ_cmd);
1311 install_element(PCU_NODE, &cfg_pcu_no_gsmtap_categ_cmd);
Pau Espin Pedrolc4178e52017-08-08 15:03:50 +02001312 install_element(PCU_NODE, &cfg_pcu_sock_cmd);
Harald Welte57d35152018-07-05 03:11:17 +02001313 install_element(PCU_NODE, &cfg_pcu_gb_dialect_cmd);
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +02001314 install_element(PCU_NODE, &cfg_pcu_timer_cmd);
Andreas Eversberg8b761a32012-07-20 21:50:31 +02001315
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +01001316 install_element_ve(&show_bts_stats_cmd);
Pau Espin Pedrola1ac2f02020-09-22 17:01:31 +02001317 install_element_ve(&show_bts_pdch_cmd);
Daniel Willmann772415f2014-01-15 17:06:51 +01001318 install_element_ve(&show_tbf_cmd);
Jacob Erlbeckf47f68a2015-06-04 10:23:24 +02001319 install_element_ve(&show_ms_all_cmd);
Jacob Erlbeck37e896d2015-06-05 16:33:33 +02001320 install_element_ve(&show_ms_tlli_cmd);
1321 install_element_ve(&show_ms_imsi_cmd);
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +02001322 install_element_ve(&show_bts_timer_cmd);
1323 install_element_ve(&show_timer_cmd);
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +01001324
Andreas Eversberg12942562012-07-12 14:31:57 +02001325 return 0;
1326}