blob: 288f2412ad7e74c91aaced90a6953a4aa79ab2b1 [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 Pedrold1049dc2021-01-18 17:14:14 +01007#include <inttypes.h>
8
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +02009#include <osmocom/core/tdef.h>
Vadim Yanitskiy657a4c02019-11-30 20:15:22 +070010#include <osmocom/core/utils.h>
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +020011#include <osmocom/vty/tdef_vty.h>
Andreas Eversberg12942562012-07-12 14:31:57 +020012#include <osmocom/vty/logging.h>
Jacob Erlbeck42aba812015-11-10 15:32:00 +010013#include <osmocom/vty/stats.h>
Jacob Erlbeckc0c580c2015-04-30 15:59:01 +020014#include <osmocom/vty/misc.h>
Andreas Eversberg8b761a32012-07-20 21:50:31 +020015#include <osmocom/core/linuxlist.h>
Holger Hans Peter Freythere8915b92014-07-02 14:57:47 +020016#include <osmocom/core/rate_ctr.h>
Pau Espin Pedrolc4178e52017-08-08 15:03:50 +020017#include <osmocom/pcu/pcuif_proto.h>
Alexander Couzens290d9032020-09-16 21:52:02 +020018#include <osmocom/gprs/gprs_ns2.h>
Andreas Eversberg12942562012-07-12 14:31:57 +020019#include "pcu_vty.h"
Andreas Eversberg8b761a32012-07-20 21:50:31 +020020#include "gprs_rlcmac.h"
Max6dc90b82018-02-19 17:17:28 +010021#include <pdch.h>
Holger Hans Peter Freyther67ed34e2013-10-17 17:01:54 +020022#include "bts.h"
Jacob Erlbeckc0c580c2015-04-30 15:59:01 +020023#include "tbf.h"
Jacob Erlbeck62e96a32015-06-04 09:42:14 +020024#include "pcu_vty_functions.h"
25
Philipp Maier9459ebd2020-09-29 23:31:33 +020026#define X(x) (1 << x)
27
Harald Welte717cdf52017-07-21 21:56:23 +020028extern void *tall_pcu_ctx;
29
30static const struct value_string pcu_gsmtap_categ_names[] = {
31 { PCU_GSMTAP_C_DL_UNKNOWN, "dl-unknown" },
32 { PCU_GSMTAP_C_DL_DUMMY, "dl-dummy" },
33 { PCU_GSMTAP_C_DL_CTRL, "dl-ctrl" },
34 { PCU_GSMTAP_C_DL_DATA_GPRS, "dl-data-gprs" },
35 { PCU_GSMTAP_C_DL_DATA_EGPRS, "dl-data-egprs" },
Harald Weltebc219d52017-07-29 13:42:27 +020036 { PCU_GSMTAP_C_DL_PTCCH, "dl-ptcch" },
Pau Espin Pedrol58543702019-09-30 19:07:16 +020037 { PCU_GSMTAP_C_DL_AGCH, "dl-agch" },
38 { PCU_GSMTAP_C_DL_PCH, "dl-pch" },
Harald Welte717cdf52017-07-21 21:56:23 +020039
40 { PCU_GSMTAP_C_UL_UNKNOWN, "ul-unknown" },
41 { PCU_GSMTAP_C_UL_DUMMY, "ul-dummy" },
42 { PCU_GSMTAP_C_UL_CTRL, "ul-ctrl" },
43 { PCU_GSMTAP_C_UL_DATA_GPRS, "ul-data-gprs" },
44 { PCU_GSMTAP_C_UL_DATA_EGPRS, "ul-data-egprs" },
Pau Espin Pedrol1ec211f2019-09-30 18:33:14 +020045 { PCU_GSMTAP_C_UL_RACH, "ul-rach" },
Vadim Yanitskiy07b64872020-06-11 00:26:15 +070046 { PCU_GSMTAP_C_UL_PTCCH, "ul-ptcch" },
Harald Welte717cdf52017-07-21 21:56:23 +020047
48 { 0, NULL }
49};
50
51static const struct value_string pcu_gsmtap_categ_help[] = {
52 { PCU_GSMTAP_C_DL_UNKNOWN, "Unknown / Unparseable / Erroneous Downlink Blocks" },
53 { PCU_GSMTAP_C_DL_DUMMY, "Downlink Dummy Blocks" },
54 { PCU_GSMTAP_C_DL_CTRL, "Downlink Control Blocks" },
55 { PCU_GSMTAP_C_DL_DATA_GPRS, "Downlink Data Blocks (GPRS)" },
56 { PCU_GSMTAP_C_DL_DATA_EGPRS, "Downlink Data Blocks (EGPRS)" },
Harald Weltebc219d52017-07-29 13:42:27 +020057 { PCU_GSMTAP_C_DL_PTCCH, "Downlink PTCCH Blocks" },
Pau Espin Pedrol58543702019-09-30 19:07:16 +020058 { PCU_GSMTAP_C_DL_AGCH, "Downlink AGCH Blocks" },
59 { PCU_GSMTAP_C_DL_PCH, "Downlink PCH Blocks" },
Harald Welte717cdf52017-07-21 21:56:23 +020060
61 { PCU_GSMTAP_C_UL_UNKNOWN, "Unknown / Unparseable / Erroneous Downlink Blocks" },
62 { PCU_GSMTAP_C_UL_DUMMY, "Uplink Dummy Blocks" },
63 { PCU_GSMTAP_C_UL_CTRL, "Uplink Control Blocks" },
64 { PCU_GSMTAP_C_UL_DATA_GPRS, "Uplink Data Blocks (GPRS)" },
65 { PCU_GSMTAP_C_UL_DATA_EGPRS, "Uplink Data Blocks (EGPRS)" },
Pau Espin Pedrol1ec211f2019-09-30 18:33:14 +020066 { PCU_GSMTAP_C_UL_RACH, "Uplink RACH Bursts" },
Vadim Yanitskiy07b64872020-06-11 00:26:15 +070067 { PCU_GSMTAP_C_UL_PTCCH, "Uplink PTCCH Bursts" },
Harald Welte717cdf52017-07-21 21:56:23 +020068
69 { 0, NULL }
70};
71
72
73DEFUN(cfg_pcu_gsmtap_categ, cfg_pcu_gsmtap_categ_cmd, "HIDDEN", "HIDDEN")
74{
Harald Welte717cdf52017-07-21 21:56:23 +020075 int categ;
76
77 categ = get_string_value(pcu_gsmtap_categ_names, argv[0]);
78 if (categ < 0)
79 return CMD_WARNING;
80
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +010081 the_pcu->gsmtap_categ_mask |= (1 << categ);
Harald Welte717cdf52017-07-21 21:56:23 +020082
83 return CMD_SUCCESS;
84}
85
86DEFUN(cfg_pcu_no_gsmtap_categ, cfg_pcu_no_gsmtap_categ_cmd, "HIDDEN", "HIDDEN")
87{
Harald Welte717cdf52017-07-21 21:56:23 +020088 int categ;
89
90 categ = get_string_value(pcu_gsmtap_categ_names, argv[0]);
91 if (categ < 0)
92 return CMD_WARNING;
93
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +010094 the_pcu->gsmtap_categ_mask &= ~(1 << categ);
Harald Welte717cdf52017-07-21 21:56:23 +020095
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{
Harald Welte717cdf52017-07-21 21:56:23 +0200107 unsigned int i;
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200108
109 vty_out(vty, "pcu%s", VTY_NEWLINE);
Pau Espin Pedrole8912222021-01-14 14:03:17 +0100110 vty_out(vty, " flow-control-interval %d%s", the_pcu->vty.fc_interval,
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200111 VTY_NEWLINE);
Pau Espin Pedrole8912222021-01-14 14:03:17 +0100112 if (the_pcu->vty.fc_bvc_bucket_size)
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200113 vty_out(vty, " flow-control force-bvc-bucket-size %d%s",
Pau Espin Pedrole8912222021-01-14 14:03:17 +0100114 the_pcu->vty.fc_bvc_bucket_size, VTY_NEWLINE);
115 if (the_pcu->vty.fc_bvc_leak_rate)
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200116 vty_out(vty, " flow-control force-bvc-leak-rate %d%s",
Pau Espin Pedrole8912222021-01-14 14:03:17 +0100117 the_pcu->vty.fc_bvc_leak_rate, VTY_NEWLINE);
118 if (the_pcu->vty.fc_ms_bucket_size)
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200119 vty_out(vty, " flow-control force-ms-bucket-size %d%s",
Pau Espin Pedrole8912222021-01-14 14:03:17 +0100120 the_pcu->vty.fc_ms_bucket_size, VTY_NEWLINE);
121 if (the_pcu->vty.fc_ms_leak_rate)
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200122 vty_out(vty, " flow-control force-ms-leak-rate %d%s",
Pau Espin Pedrole8912222021-01-14 14:03:17 +0100123 the_pcu->vty.fc_ms_leak_rate, VTY_NEWLINE);
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100124 if (the_pcu->vty.force_initial_cs) {
Pau Espin Pedrol793583e2021-01-14 16:20:57 +0100125 if (the_pcu->vty.initial_cs_ul == the_pcu->vty.initial_cs_dl)
126 vty_out(vty, " cs %d%s", the_pcu->vty.initial_cs_dl,
Andreas Eversberg499ff412012-10-03 14:21:36 +0200127 VTY_NEWLINE);
128 else
Pau Espin Pedrol793583e2021-01-14 16:20:57 +0100129 vty_out(vty, " cs %d %d%s", the_pcu->vty.initial_cs_dl,
130 the_pcu->vty.initial_cs_ul, VTY_NEWLINE);
Holger Hans Peter Freytherc421e8a2014-07-02 14:55:17 +0200131 }
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100132 if (the_pcu->vty.max_cs_dl && the_pcu->vty.max_cs_ul) {
133 if (the_pcu->vty.max_cs_ul == the_pcu->vty.max_cs_dl)
134 vty_out(vty, " cs max %d%s", the_pcu->vty.max_cs_dl,
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200135 VTY_NEWLINE);
136 else
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100137 vty_out(vty, " cs max %d %d%s", the_pcu->vty.max_cs_dl,
138 the_pcu->vty.max_cs_ul, VTY_NEWLINE);
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200139 }
Pau Espin Pedrole8dcf642021-01-14 13:17:01 +0100140 if (the_pcu->vty.cs_adj_enabled)
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200141 vty_out(vty, " cs threshold %d %d%s",
Pau Espin Pedrole8dcf642021-01-14 13:17:01 +0100142 the_pcu->vty.cs_adj_lower_limit, the_pcu->vty.cs_adj_upper_limit,
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200143 VTY_NEWLINE);
144 else
145 vty_out(vty, " no cs threshold%s", VTY_NEWLINE);
146
Pau Espin Pedrolad79b852021-01-14 13:20:55 +0100147 if (the_pcu->vty.cs_downgrade_threshold)
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +0200148 vty_out(vty, " cs downgrade-threshold %d%s",
Pau Espin Pedrolad79b852021-01-14 13:20:55 +0100149 the_pcu->vty.cs_downgrade_threshold, VTY_NEWLINE);
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +0200150 else
151 vty_out(vty, " no cs downgrade-threshold%s", VTY_NEWLINE);
152
Jacob Erlbeck94cde132015-06-09 09:44:36 +0200153 vty_out(vty, " cs link-quality-ranges cs1 %d cs2 %d %d cs3 %d %d cs4 %d%s",
Pau Espin Pedrol54b159a2021-01-14 13:30:04 +0100154 the_pcu->vty.cs_lqual_ranges[0].high,
155 the_pcu->vty.cs_lqual_ranges[1].low,
156 the_pcu->vty.cs_lqual_ranges[1].high,
157 the_pcu->vty.cs_lqual_ranges[2].low,
158 the_pcu->vty.cs_lqual_ranges[2].high,
159 the_pcu->vty.cs_lqual_ranges[3].low,
Jacob Erlbeck94cde132015-06-09 09:44:36 +0200160 VTY_NEWLINE);
161
Minh-Quang Nguyen1f189092017-08-16 09:50:06 -0400162 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",
Pau Espin Pedrol54b159a2021-01-14 13:30:04 +0100163 the_pcu->vty.mcs_lqual_ranges[0].high,
164 the_pcu->vty.mcs_lqual_ranges[1].low,
165 the_pcu->vty.mcs_lqual_ranges[1].high,
166 the_pcu->vty.mcs_lqual_ranges[2].low,
167 the_pcu->vty.mcs_lqual_ranges[2].high,
168 the_pcu->vty.mcs_lqual_ranges[3].low,
169 the_pcu->vty.mcs_lqual_ranges[3].high,
170 the_pcu->vty.mcs_lqual_ranges[4].low,
171 the_pcu->vty.mcs_lqual_ranges[4].high,
172 the_pcu->vty.mcs_lqual_ranges[5].low,
173 the_pcu->vty.mcs_lqual_ranges[5].high,
174 the_pcu->vty.mcs_lqual_ranges[6].low,
175 the_pcu->vty.mcs_lqual_ranges[6].high,
176 the_pcu->vty.mcs_lqual_ranges[7].low,
177 the_pcu->vty.mcs_lqual_ranges[7].high,
178 the_pcu->vty.mcs_lqual_ranges[8].low,
Minh-Quang Nguyen1f189092017-08-16 09:50:06 -0400179 VTY_NEWLINE);
180
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100181 if (the_pcu->vty.force_initial_mcs) {
Pau Espin Pedrol793583e2021-01-14 16:20:57 +0100182 if (the_pcu->vty.initial_mcs_ul == the_pcu->vty.initial_mcs_dl)
183 vty_out(vty, " mcs %d%s", the_pcu->vty.initial_mcs_dl,
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +0100184 VTY_NEWLINE);
185 else
Pau Espin Pedrol793583e2021-01-14 16:20:57 +0100186 vty_out(vty, " mcs %d %d%s", the_pcu->vty.initial_mcs_dl,
187 the_pcu->vty.initial_mcs_ul, VTY_NEWLINE);
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +0100188 }
Minh-Quang Nguyen1f189092017-08-16 09:50:06 -0400189
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100190 if (the_pcu->vty.max_mcs_dl && the_pcu->vty.max_mcs_ul) {
191 if (the_pcu->vty.max_mcs_ul == the_pcu->vty.max_mcs_dl)
192 vty_out(vty, " mcs max %d%s", the_pcu->vty.max_mcs_dl,
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100193 VTY_NEWLINE);
194 else
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100195 vty_out(vty, " mcs max %d %d%s", the_pcu->vty.max_mcs_dl,
196 the_pcu->vty.max_mcs_ul, VTY_NEWLINE);
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100197 }
198
Pau Espin Pedrol519d0712021-01-14 14:30:03 +0100199 vty_out(vty, " window-size %d %d%s", the_pcu->vty.ws_base, the_pcu->vty.ws_pdch,
Jacob Erlbeck36df7742016-01-19 15:53:30 +0100200 VTY_NEWLINE);
201
Pau Espin Pedrol97296b22021-01-14 13:08:02 +0100202 if (the_pcu->vty.dl_arq_type == EGPRS_ARQ2)
203 vty_out(vty, " egprs dl arq-type arq2%s", VTY_NEWLINE);
Aravind Sirsikar50b09702016-08-22 17:21:10 +0530204
Pau Espin Pedrolf473ec92021-01-14 14:45:14 +0100205 if (the_pcu->vty.force_llc_lifetime == 0xffff)
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200206 vty_out(vty, " queue lifetime infinite%s", VTY_NEWLINE);
Pau Espin Pedrolf473ec92021-01-14 14:45:14 +0100207 else if (the_pcu->vty.force_llc_lifetime)
208 vty_out(vty, " queue lifetime %d%s", the_pcu->vty.force_llc_lifetime,
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200209 VTY_NEWLINE);
Pau Espin Pedrolf473ec92021-01-14 14:45:14 +0100210 if (the_pcu->vty.llc_discard_csec)
211 vty_out(vty, " queue hysteresis %d%s", the_pcu->vty.llc_discard_csec,
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100212 VTY_NEWLINE);
Pau Espin Pedrolf473ec92021-01-14 14:45:14 +0100213 if (the_pcu->vty.llc_idle_ack_csec)
214 vty_out(vty, " queue idle-ack-delay %d%s", the_pcu->vty.llc_idle_ack_csec,
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200215 VTY_NEWLINE);
Pau Espin Pedrolf473ec92021-01-14 14:45:14 +0100216 if (the_pcu->vty.llc_codel_interval_msec == LLC_CODEL_USE_DEFAULT)
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200217 vty_out(vty, " queue codel%s", VTY_NEWLINE);
Pau Espin Pedrolf473ec92021-01-14 14:45:14 +0100218 else if (the_pcu->vty.llc_codel_interval_msec == LLC_CODEL_DISABLE)
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200219 vty_out(vty, " no queue codel%s", VTY_NEWLINE);
220 else
221 vty_out(vty, " queue codel interval %d%s",
Pau Espin Pedrolf473ec92021-01-14 14:45:14 +0100222 the_pcu->vty.llc_codel_interval_msec/10, VTY_NEWLINE);
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200223
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);
Pau Espin Pedrol03de8982021-01-14 12:48:50 +0100230 if (the_pcu->vty.force_two_phase)
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200231 vty_out(vty, " two-phase-access%s", VTY_NEWLINE);
Pau Espin Pedrola2814952021-01-14 12:53:53 +0100232 vty_out(vty, " alpha %d%s", the_pcu->vty.alpha, VTY_NEWLINE);
233 vty_out(vty, " gamma %d%s", the_pcu->vty.gamma * 2, VTY_NEWLINE);
Pau Espin Pedrol05f9f592021-01-14 12:56:58 +0100234 if (!the_pcu->vty.dl_tbf_preemptive_retransmission)
Oliver Smith45fdc442019-09-05 15:12:20 +0200235 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
Pau Espin Pedrol113fb412021-01-14 13:36:02 +0100247 if (the_pcu->vty.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 Pedrol924aaad2021-01-14 12:01:42 +0100252 osmo_tdef_vty_write(vty, the_pcu->T_defs, " timer ");
Pau Espin Pedrol18794422019-09-26 18:25:35 +0200253
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{
Pau Espin Pedrole8912222021-01-14 14:03:17 +0100296 the_pcu->vty.fc_interval = atoi(argv[0]);
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200297 return CMD_SUCCESS;
298}
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200299#define FC_STR "BSSGP Flow Control configuration\n"
300#define FC_BMAX_STR(who) "Force a fixed value for the " who " bucket size\n"
301#define FC_LR_STR(who) "Force a fixed value for the " who " leak rate\n"
302
Philipp Maier9459ebd2020-09-29 23:31:33 +0200303DEFUN_ATTR(cfg_pcu_fc_bvc_bucket_size,
304 cfg_pcu_fc_bvc_bucket_size_cmd,
305 "flow-control force-bvc-bucket-size <1-6553500>",
306 FC_STR FC_BMAX_STR("BVC") "Bucket size in octets\n",
307 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200308{
Pau Espin Pedrole8912222021-01-14 14:03:17 +0100309 the_pcu->vty.fc_bvc_bucket_size = atoi(argv[0]);
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200310 return CMD_SUCCESS;
311}
312
Philipp Maier9459ebd2020-09-29 23:31:33 +0200313DEFUN_ATTR(cfg_pcu_no_fc_bvc_bucket_size,
314 cfg_pcu_no_fc_bvc_bucket_size_cmd,
315 "no flow-control force-bvc-bucket-size",
316 NO_STR FC_STR FC_BMAX_STR("BVC"),
317 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200318{
Pau Espin Pedrole8912222021-01-14 14:03:17 +0100319 the_pcu->vty.fc_bvc_bucket_size = 0;
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200320 return CMD_SUCCESS;
321}
322
Philipp Maier9459ebd2020-09-29 23:31:33 +0200323DEFUN_ATTR(cfg_pcu_fc_bvc_leak_rate,
324 cfg_pcu_fc_bvc_leak_rate_cmd,
325 "flow-control force-bvc-leak-rate <1-6553500>",
326 FC_STR FC_LR_STR("BVC") "Leak rate in bit/s\n",
327 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200328{
Pau Espin Pedrole8912222021-01-14 14:03:17 +0100329 the_pcu->vty.fc_bvc_leak_rate = atoi(argv[0]);
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200330
331 return CMD_SUCCESS;
332}
333
Philipp Maier9459ebd2020-09-29 23:31:33 +0200334DEFUN_ATTR(cfg_pcu_no_fc_bvc_leak_rate,
335 cfg_pcu_no_fc_bvc_leak_rate_cmd,
336 "no flow-control force-bvc-leak-rate",
337 NO_STR FC_STR FC_LR_STR("BVC"),
338 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200339{
Pau Espin Pedrole8912222021-01-14 14:03:17 +0100340 the_pcu->vty.fc_bvc_leak_rate = 0;
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200341 return CMD_SUCCESS;
342}
343
Philipp Maier9459ebd2020-09-29 23:31:33 +0200344DEFUN_ATTR(cfg_pcu_fc_ms_bucket_size,
345 cfg_pcu_fc_ms_bucket_size_cmd,
346 "flow-control force-ms-bucket-size <1-6553500>",
347 FC_STR FC_BMAX_STR("default MS") "Bucket size in octets\n",
348 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200349{
Pau Espin Pedrole8912222021-01-14 14:03:17 +0100350 the_pcu->vty.fc_ms_bucket_size = atoi(argv[0]);
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200351 return CMD_SUCCESS;
352}
353
Philipp Maier9459ebd2020-09-29 23:31:33 +0200354DEFUN_ATTR(cfg_pcu_no_fc_ms_bucket_size,
355 cfg_pcu_no_fc_ms_bucket_size_cmd,
356 "no flow-control force-ms-bucket-size",
357 NO_STR FC_STR FC_BMAX_STR("default MS"),
358 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200359{
Pau Espin Pedrole8912222021-01-14 14:03:17 +0100360 the_pcu->vty.fc_ms_bucket_size = 0;
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200361 return CMD_SUCCESS;
362}
363
Philipp Maier9459ebd2020-09-29 23:31:33 +0200364DEFUN_ATTR(cfg_pcu_fc_ms_leak_rate,
365 cfg_pcu_fc_ms_leak_rate_cmd,
366 "flow-control force-ms-leak-rate <1-6553500>",
367 FC_STR FC_LR_STR("default MS") "Leak rate in bit/s\n",
368 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200369{
Pau Espin Pedrole8912222021-01-14 14:03:17 +0100370 the_pcu->vty.fc_ms_leak_rate = atoi(argv[0]);
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200371 return CMD_SUCCESS;
372}
373
Philipp Maier9459ebd2020-09-29 23:31:33 +0200374DEFUN_ATTR(cfg_pcu_no_fc_ms_leak_rate,
375 cfg_pcu_no_fc_ms_leak_rate_cmd,
376 "no flow-control force-ms-leak-rate",
377 NO_STR FC_STR FC_LR_STR("default MS"),
378 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200379{
Pau Espin Pedrole8912222021-01-14 14:03:17 +0100380 the_pcu->vty.fc_ms_leak_rate = 0;
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200381 return CMD_SUCCESS;
382}
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200383
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200384#define FC_BTIME_STR "Set target downlink maximum queueing time (only affects the advertised bucket size)\n"
Philipp Maier9459ebd2020-09-29 23:31:33 +0200385DEFUN_ATTR(cfg_pcu_fc_bucket_time,
386 cfg_pcu_fc_bucket_time_cmd,
387 "flow-control bucket-time <1-65534>",
388 FC_STR FC_BTIME_STR "Time in centi-seconds\n",
389 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200390{
Pau Espin Pedrole8912222021-01-14 14:03:17 +0100391 the_pcu->vty.fc_bucket_time = atoi(argv[0]);
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200392 return CMD_SUCCESS;
393}
394
Philipp Maier9459ebd2020-09-29 23:31:33 +0200395DEFUN_ATTR(cfg_pcu_no_fc_bucket_time,
396 cfg_pcu_no_fc_bucket_time_cmd,
397 "no flow-control bucket-time",
398 NO_STR FC_STR FC_BTIME_STR,
399 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200400{
Pau Espin Pedrole8912222021-01-14 14:03:17 +0100401 the_pcu->vty.fc_bucket_time = 0;
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200402 return CMD_SUCCESS;
403}
404
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200405#define CS_STR "Coding Scheme configuration\n"
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200406
Philipp Maier9459ebd2020-09-29 23:31:33 +0200407DEFUN_ATTR(cfg_pcu_cs,
408 cfg_pcu_cs_cmd,
409 "cs <1-4> [<1-4>]",
410 CS_STR
411 "Initial CS value to be used (overrides BTS config)\n"
412 "Use a different initial CS value for the uplink",
413 CMD_ATTR_IMMEDIATE)
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200414{
Pau Espin Pedrol793583e2021-01-14 16:20:57 +0100415 uint8_t cs_dl, cs_ul;
416 cs_dl = atoi(argv[0]);
Andreas Eversberg499ff412012-10-03 14:21:36 +0200417 if (argc > 1)
Pau Espin Pedrol793583e2021-01-14 16:20:57 +0100418 cs_ul = atoi(argv[1]);
Andreas Eversberg499ff412012-10-03 14:21:36 +0200419 else
Pau Espin Pedrol793583e2021-01-14 16:20:57 +0100420 cs_ul = cs_dl;
421 the_pcu->vty.force_initial_cs = true;
422 gprs_pcu_set_initial_cs(the_pcu, cs_dl, cs_ul);
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200423 return CMD_SUCCESS;
424}
425
Philipp Maier9459ebd2020-09-29 23:31:33 +0200426DEFUN_ATTR(cfg_pcu_no_cs,
427 cfg_pcu_no_cs_cmd,
428 "no cs",
429 NO_STR CS_STR,
430 CMD_ATTR_IMMEDIATE)
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200431{
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100432 the_pcu->vty.force_initial_cs = false;
Pau Espin Pedrol793583e2021-01-14 16:20:57 +0100433 gprs_pcu_set_initial_cs(the_pcu, 0, 0);
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200434 return CMD_SUCCESS;
435}
436
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100437#define CS_MAX_STR "Set maximum values for adaptive CS selection (overrides BTS config)\n"
Philipp Maier9459ebd2020-09-29 23:31:33 +0200438DEFUN_ATTR(cfg_pcu_cs_max,
439 cfg_pcu_cs_max_cmd,
440 "cs max <1-4> [<1-4>]",
441 CS_STR
442 CS_MAX_STR
443 "Maximum CS value to be used\n"
444 "Use a different maximum CS value for the uplink",
445 CMD_ATTR_IMMEDIATE)
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200446{
Pau Espin Pedrol343ec9b2020-10-30 18:35:54 +0100447 uint8_t cs_dl = atoi(argv[0]);
448 uint8_t cs_ul;
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200449
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200450 if (argc > 1)
Pau Espin Pedrol343ec9b2020-10-30 18:35:54 +0100451 cs_ul = atoi(argv[1]);
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200452 else
Pau Espin Pedrol343ec9b2020-10-30 18:35:54 +0100453 cs_ul = cs_dl;
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200454
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100455 gprs_pcu_set_max_cs(the_pcu, cs_dl, cs_ul);
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200456 return CMD_SUCCESS;
457}
458
Philipp Maier9459ebd2020-09-29 23:31:33 +0200459DEFUN_ATTR(cfg_pcu_no_cs_max,
460 cfg_pcu_no_cs_max_cmd,
461 "no cs max",
462 NO_STR CS_STR CS_MAX_STR,
463 CMD_ATTR_IMMEDIATE)
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200464{
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100465 gprs_pcu_set_max_cs(the_pcu, 0, 0);
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200466 return CMD_SUCCESS;
467}
468
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100469#define MCS_STR "Modulation and Coding Scheme configuration (EGPRS)\n"
Philipp Maier9459ebd2020-09-29 23:31:33 +0200470DEFUN_ATTR(cfg_pcu_mcs,
471 cfg_pcu_mcs_cmd,
472 "mcs <1-9> [<1-9>]",
473 MCS_STR
474 "Initial MCS value to be used (default 1)\n"
475 "Use a different initial MCS value for the uplink",
476 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +0100477{
Pau Espin Pedrol793583e2021-01-14 16:20:57 +0100478 uint8_t mcs_dl, mcs_ul;
479 mcs_dl = atoi(argv[0]);
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +0100480 if (argc > 1)
Pau Espin Pedrol793583e2021-01-14 16:20:57 +0100481 mcs_ul = atoi(argv[1]);
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +0100482 else
Pau Espin Pedrol793583e2021-01-14 16:20:57 +0100483 mcs_ul = mcs_dl;
484 the_pcu->vty.force_initial_mcs = true;
485 gprs_pcu_set_initial_mcs(the_pcu, mcs_dl, mcs_ul);
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +0100486 return CMD_SUCCESS;
487}
488
Philipp Maier9459ebd2020-09-29 23:31:33 +0200489DEFUN_ATTR(cfg_pcu_no_mcs,
490 cfg_pcu_no_mcs_cmd,
491 "no mcs",
492 NO_STR MCS_STR,
493 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +0100494{
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100495 the_pcu->vty.force_initial_mcs = false;
Pau Espin Pedrol793583e2021-01-14 16:20:57 +0100496 gprs_pcu_set_initial_mcs(the_pcu, 0, 0);
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +0100497 return CMD_SUCCESS;
498}
499
Philipp Maier9459ebd2020-09-29 23:31:33 +0200500DEFUN_ATTR(cfg_pcu_mcs_max,
501 cfg_pcu_mcs_max_cmd,
502 "mcs max <1-9> [<1-9>]",
503 MCS_STR
504 CS_MAX_STR
505 "Maximum MCS value to be used\n"
506 "Use a different maximum MCS value for the uplink",
507 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100508{
Pau Espin Pedrol343ec9b2020-10-30 18:35:54 +0100509 uint8_t mcs_dl = atoi(argv[0]);
510 uint8_t mcs_ul;
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100511
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100512 if (argc > 1)
Pau Espin Pedrol343ec9b2020-10-30 18:35:54 +0100513 mcs_ul = atoi(argv[1]);
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100514 else
Pau Espin Pedrol343ec9b2020-10-30 18:35:54 +0100515 mcs_ul = mcs_dl;
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100516
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100517 gprs_pcu_set_max_mcs(the_pcu, mcs_dl, mcs_ul);
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100518 return CMD_SUCCESS;
519}
520
Philipp Maier9459ebd2020-09-29 23:31:33 +0200521DEFUN_ATTR(cfg_pcu_no_mcs_max,
522 cfg_pcu_no_mcs_max_cmd,
523 "no mcs max",
524 NO_STR MCS_STR CS_MAX_STR,
525 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100526{
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100527 gprs_pcu_set_max_mcs(the_pcu, 0, 0);
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100528 return CMD_SUCCESS;
529}
530
Aravind Sirsikar50b09702016-08-22 17:21:10 +0530531#define DL_STR "downlink specific configuration\n"
532
Philipp Maier9459ebd2020-09-29 23:31:33 +0200533DEFUN_ATTR(cfg_pcu_dl_arq_type,
534 cfg_pcu_dl_arq_cmd,
535 "egprs dl arq-type (spb|arq2)",
536 EGPRS_STR DL_STR "ARQ options\n"
537 "enable SPB(ARQ1) support\n"
538 "enable ARQ2 support",
539 CMD_ATTR_IMMEDIATE)
Aravind Sirsikar50b09702016-08-22 17:21:10 +0530540{
Aravind Sirsikar50b09702016-08-22 17:21:10 +0530541 if (!strcmp(argv[0], "arq2"))
Pau Espin Pedrol97296b22021-01-14 13:08:02 +0100542 the_pcu->vty.dl_arq_type = EGPRS_ARQ2;
Aravind Sirsikar50b09702016-08-22 17:21:10 +0530543 else
Pau Espin Pedrol97296b22021-01-14 13:08:02 +0100544 the_pcu->vty.dl_arq_type = EGPRS_ARQ1;
Aravind Sirsikar50b09702016-08-22 17:21:10 +0530545
546 return CMD_SUCCESS;
547}
548
Philipp Maier9459ebd2020-09-29 23:31:33 +0200549DEFUN_USRATTR(cfg_pcu_window_size,
550 cfg_pcu_window_size_cmd,
551 X(PCU_VTY_ATTR_NEW_TBF),
552 "window-size <0-1024> [<0-256>]",
553 "Window size configuration (b + N_PDCH * f)\n"
554 "Base value (b)\n"
555 "Factor for number of PDCH (f)")
Jacob Erlbeck36df7742016-01-19 15:53:30 +0100556{
Jacob Erlbeck36df7742016-01-19 15:53:30 +0100557 uint16_t b = atoi(argv[0]);
558
Pau Espin Pedrol519d0712021-01-14 14:30:03 +0100559 the_pcu->vty.ws_base = b;
Jacob Erlbeck36df7742016-01-19 15:53:30 +0100560 if (argc > 1) {
561 uint16_t f = atoi(argv[1]);
Pau Espin Pedrol519d0712021-01-14 14:30:03 +0100562 the_pcu->vty.ws_pdch = f;
Jacob Erlbeck36df7742016-01-19 15:53:30 +0100563 }
564
565 return CMD_SUCCESS;
566}
567
568
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200569#define QUEUE_STR "Packet queue options\n"
570#define LIFETIME_STR "Set lifetime limit of LLC frame in centi-seconds " \
571 "(overrides the value given by SGSN)\n"
572
Philipp Maier9459ebd2020-09-29 23:31:33 +0200573DEFUN_USRATTR(cfg_pcu_queue_lifetime,
574 cfg_pcu_queue_lifetime_cmd,
575 X(PCU_VTY_ATTR_NEW_TBF),
576 "queue lifetime <1-65534>",
577 QUEUE_STR LIFETIME_STR "Lifetime in centi-seconds")
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200578{
Jacob Erlbeck2acfbeb2015-04-30 17:55:16 +0200579 uint16_t csec = atoi(argv[0]);
Pau Espin Pedrolf473ec92021-01-14 14:45:14 +0100580 the_pcu->vty.force_llc_lifetime = csec;
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200581 return CMD_SUCCESS;
582}
583
Philipp Maier9459ebd2020-09-29 23:31:33 +0200584DEFUN_USRATTR(cfg_pcu_queue_lifetime_inf,
585 cfg_pcu_queue_lifetime_inf_cmd,
586 X(PCU_VTY_ATTR_NEW_TBF),
587 "queue lifetime infinite",
588 QUEUE_STR LIFETIME_STR "Infinite lifetime")
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200589{
Pau Espin Pedrolf473ec92021-01-14 14:45:14 +0100590 the_pcu->vty.force_llc_lifetime = 0xffff;
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200591 return CMD_SUCCESS;
592}
593
Philipp Maier9459ebd2020-09-29 23:31:33 +0200594DEFUN_USRATTR(cfg_pcu_no_queue_lifetime,
595 cfg_pcu_no_queue_lifetime_cmd,
596 X(PCU_VTY_ATTR_NEW_TBF),
597 "no queue lifetime",
598 NO_STR QUEUE_STR "Disable lifetime limit of LLC frame (use value given "
599 "by SGSN)\n")
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200600{
Pau Espin Pedrolf473ec92021-01-14 14:45:14 +0100601 the_pcu->vty.force_llc_lifetime = 0;
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200602 return CMD_SUCCESS;
603}
604
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100605#define QUEUE_HYSTERESIS_STR "Set lifetime hysteresis of LLC frame in centi-seconds " \
606 "(continue discarding until lifetime-hysteresis is reached)\n"
607
Philipp Maier9459ebd2020-09-29 23:31:33 +0200608DEFUN_USRATTR(cfg_pcu_queue_hysteresis,
609 cfg_pcu_queue_hysteresis_cmd,
610 X(PCU_VTY_ATTR_NEW_TBF),
611 "queue hysteresis <1-65535>",
612 QUEUE_STR QUEUE_HYSTERESIS_STR "Hysteresis in centi-seconds")
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100613{
Jacob Erlbeck2acfbeb2015-04-30 17:55:16 +0200614 uint16_t csec = atoi(argv[0]);
Pau Espin Pedrolf473ec92021-01-14 14:45:14 +0100615 the_pcu->vty.llc_discard_csec = csec;
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100616 return CMD_SUCCESS;
617}
618
Philipp Maier9459ebd2020-09-29 23:31:33 +0200619DEFUN_USRATTR(cfg_pcu_no_queue_hysteresis,
620 cfg_pcu_no_queue_hysteresis_cmd,
621 X(PCU_VTY_ATTR_NEW_TBF),
622 "no queue hysteresis",
623 NO_STR QUEUE_STR QUEUE_HYSTERESIS_STR)
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100624{
Pau Espin Pedrolf473ec92021-01-14 14:45:14 +0100625 the_pcu->vty.llc_discard_csec = 0;
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100626 return CMD_SUCCESS;
627}
628
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200629#define QUEUE_CODEL_STR "Set CoDel queue management\n"
Philipp Maier9459ebd2020-09-29 23:31:33 +0200630DEFUN_USRATTR(cfg_pcu_queue_codel,
631 cfg_pcu_queue_codel_cmd,
632 X(PCU_VTY_ATTR_NEW_SUBSCR),
633 "queue codel",
634 QUEUE_STR QUEUE_CODEL_STR)
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200635{
Pau Espin Pedrolf473ec92021-01-14 14:45:14 +0100636 the_pcu->vty.llc_codel_interval_msec = LLC_CODEL_USE_DEFAULT;
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200637 return CMD_SUCCESS;
638}
639
Philipp Maier9459ebd2020-09-29 23:31:33 +0200640DEFUN_USRATTR(cfg_pcu_queue_codel_interval,
641 cfg_pcu_queue_codel_interval_cmd,
642 X(PCU_VTY_ATTR_NEW_SUBSCR),
643 "queue codel interval <1-1000>",
644 QUEUE_STR QUEUE_CODEL_STR "Specify interval\n" "Interval in centi-seconds")
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200645{
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200646 uint16_t csec = atoi(argv[0]);
Pau Espin Pedrolf473ec92021-01-14 14:45:14 +0100647 the_pcu->vty.llc_codel_interval_msec = 10*csec;
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200648 return CMD_SUCCESS;
649}
650
Philipp Maier9459ebd2020-09-29 23:31:33 +0200651DEFUN_USRATTR(cfg_pcu_no_queue_codel,
652 cfg_pcu_no_queue_codel_cmd,
653 X(PCU_VTY_ATTR_NEW_SUBSCR),
654 "no queue codel",
655 NO_STR QUEUE_STR QUEUE_CODEL_STR)
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200656{
Pau Espin Pedrolf473ec92021-01-14 14:45:14 +0100657 the_pcu->vty.llc_codel_interval_msec = LLC_CODEL_DISABLE;
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200658 return CMD_SUCCESS;
659}
660
661
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200662#define QUEUE_IDLE_ACK_STR "Request an ACK after the last DL LLC frame in centi-seconds\n"
663
Philipp Maier9459ebd2020-09-29 23:31:33 +0200664DEFUN_ATTR(cfg_pcu_queue_idle_ack_delay,
665 cfg_pcu_queue_idle_ack_delay_cmd,
666 "queue idle-ack-delay <1-65535>",
667 QUEUE_STR QUEUE_IDLE_ACK_STR "Idle ACK delay in centi-seconds",
668 CMD_ATTR_IMMEDIATE)
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200669{
Jacob Erlbeck2acfbeb2015-04-30 17:55:16 +0200670 uint16_t csec = atoi(argv[0]);
Pau Espin Pedrolf473ec92021-01-14 14:45:14 +0100671 the_pcu->vty.llc_idle_ack_csec = csec;
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200672 return CMD_SUCCESS;
673}
674
Philipp Maier9459ebd2020-09-29 23:31:33 +0200675DEFUN_ATTR(cfg_pcu_no_queue_idle_ack_delay,
676 cfg_pcu_no_queue_idle_ack_delay_cmd,
677 "no queue idle-ack-delay",
678 NO_STR QUEUE_STR QUEUE_IDLE_ACK_STR,
679 CMD_ATTR_IMMEDIATE)
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200680{
Pau Espin Pedrolf473ec92021-01-14 14:45:14 +0100681 the_pcu->vty.llc_idle_ack_csec = 0;
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200682 return CMD_SUCCESS;
683}
684
Philipp Maier9459ebd2020-09-29 23:31:33 +0200685DEFUN_ATTR(cfg_pcu_alloc,
686 cfg_pcu_alloc_cmd,
687 "alloc-algorithm (a|b|dynamic)",
688 "Select slot allocation algorithm to use when assigning timeslots on "
689 "PACCH\n"
690 "Single slot is assigned only\n"
691 "Multiple slots are assigned for semi-duplex operation\n"
692 "Dynamically select the algorithm based on the system state\n",
693 CMD_ATTR_IMMEDIATE)
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200694{
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200695 switch (argv[0][0]) {
696 case 'a':
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100697 the_pcu->alloc_algorithm = alloc_algorithm_a;
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200698 break;
699 case 'b':
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100700 the_pcu->alloc_algorithm = alloc_algorithm_b;
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200701 break;
Jacob Erlbeck400ec022015-07-14 13:31:48 +0200702 default:
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100703 the_pcu->alloc_algorithm = alloc_algorithm_dynamic;
Jacob Erlbeck400ec022015-07-14 13:31:48 +0200704 break;
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200705 }
706
707 return CMD_SUCCESS;
708}
709
Philipp Maier9459ebd2020-09-29 23:31:33 +0200710DEFUN_ATTR(cfg_pcu_two_phase,
711 cfg_pcu_two_phase_cmd,
712 "two-phase-access",
713 "Force two phase access when MS requests single phase access\n",
714 CMD_ATTR_IMMEDIATE)
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200715{
Pau Espin Pedrol03de8982021-01-14 12:48:50 +0100716 the_pcu->vty.force_two_phase = 1;
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200717 return CMD_SUCCESS;
718}
719
Philipp Maier9459ebd2020-09-29 23:31:33 +0200720DEFUN_ATTR(cfg_pcu_no_two_phase,
721 cfg_pcu_no_two_phase_cmd,
722 "no two-phase-access",
723 NO_STR "Only use two phase access when requested my MS\n",
724 CMD_ATTR_IMMEDIATE)
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200725{
Pau Espin Pedrol03de8982021-01-14 12:48:50 +0100726 the_pcu->vty.force_two_phase = 0;
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200727 return CMD_SUCCESS;
728}
729
Philipp Maier9459ebd2020-09-29 23:31:33 +0200730DEFUN_ATTR(cfg_pcu_alpha,
731 cfg_pcu_alpha_cmd,
732 "alpha <0-10>",
733 "Alpha parameter for MS power control in units of 0.1 (see TS 05.08) "
734 "NOTE: Be sure to set Alpha value at System information 13 too.\n"
735 "Alpha in units of 0.1\n",
736 CMD_ATTR_IMMEDIATE)
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200737{
Pau Espin Pedrola2814952021-01-14 12:53:53 +0100738 the_pcu->vty.alpha = atoi(argv[0]);
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200739 return CMD_SUCCESS;
740}
741
Philipp Maier9459ebd2020-09-29 23:31:33 +0200742DEFUN_ATTR(cfg_pcu_gamma,
743 cfg_pcu_gamma_cmd,
744 "gamma <0-62>",
745 "Gamma parameter for MS power control in units of dB (see TS 05.08)\n"
746 "Gamma in even unit of dBs\n",
747 CMD_ATTR_IMMEDIATE)
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200748{
Pau Espin Pedrola2814952021-01-14 12:53:53 +0100749 the_pcu->vty.gamma = atoi(argv[0]) / 2;
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200750 return CMD_SUCCESS;
751}
752
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +0100753DEFUN(show_bts_stats,
754 show_bts_stats_cmd,
755 "show bts statistics",
756 SHOW_STR "BTS related functionality\nStatistics\n")
757{
Pau Espin Pedrold1049dc2021-01-18 17:14:14 +0100758 struct gprs_rlcmac_bts *bts;
759 llist_for_each_entry(bts, &the_pcu->bts_list, list) {
760 vty_out(vty, "BTS%" PRIu8 ":%s", bts->nr, VTY_NEWLINE);
761 vty_out_rate_ctr_group(vty, " ", bts_rate_counters(bts));
762 }
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +0100763 return CMD_SUCCESS;
Daniel Willmann772415f2014-01-15 17:06:51 +0100764}
765
Pau Espin Pedrola1ac2f02020-09-22 17:01:31 +0200766DEFUN(show_bts_pdch,
767 show_bts_pdch_cmd,
768 "show bts pdch",
769 SHOW_STR "BTS related functionality\nPDCH timeslots\n")
770{
Pau Espin Pedrold1049dc2021-01-18 17:14:14 +0100771 struct gprs_rlcmac_bts *bts;
772 llist_for_each_entry(bts, &the_pcu->bts_list, list) {
773 pcu_vty_show_bts_pdch(vty, bts);
774 }
775 return CMD_SUCCESS;
Pau Espin Pedrola1ac2f02020-09-22 17:01:31 +0200776}
777
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100778#define IDLE_TIME_STR "keep an idle DL TBF alive for the time given\n"
Pau Espin Pedrol2b5c6292019-09-09 13:41:00 +0200779DEFUN_DEPRECATED(cfg_pcu_dl_tbf_idle_time,
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100780 cfg_pcu_dl_tbf_idle_time_cmd,
781 "dl-tbf-idle-time <1-5000>",
782 IDLE_TIME_STR "idle time in msec")
783{
Pau Espin Pedrol2b5c6292019-09-09 13:41:00 +0200784 vty_out(vty, "%% 'dl-tbf-idle-time' is now deprecated: use 'timer X2031 <val>' instead%s", VTY_NEWLINE);
785
Pau Espin Pedrol924aaad2021-01-14 12:01:42 +0100786 if (osmo_tdef_set(the_pcu->T_defs, -2031, atoi(argv[0]), OSMO_TDEF_MS) < 0)
Pau Espin Pedrol2b5c6292019-09-09 13:41:00 +0200787 return CMD_WARNING;
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100788 return CMD_SUCCESS;
789}
790
Pau Espin Pedrol2b5c6292019-09-09 13:41:00 +0200791DEFUN_DEPRECATED(cfg_pcu_no_dl_tbf_idle_time,
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100792 cfg_pcu_no_dl_tbf_idle_time_cmd,
793 "no dl-tbf-idle-time",
794 NO_STR IDLE_TIME_STR)
795{
Pau Espin Pedrol2b5c6292019-09-09 13:41:00 +0200796 vty_out(vty, "%% 'no dl-tbf-idle-time' is now deprecated: use 'timer X2031 0' instead%s", VTY_NEWLINE);
797
Pau Espin Pedrol924aaad2021-01-14 12:01:42 +0100798 if (osmo_tdef_set(the_pcu->T_defs, -2031, 0, OSMO_TDEF_MS) < 0)
Pau Espin Pedrol2b5c6292019-09-09 13:41:00 +0200799 return CMD_WARNING;
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100800 return CMD_SUCCESS;
801}
802
Oliver Smith45fdc442019-09-05 15:12:20 +0200803#define RETRANSMISSION_STR "retransmit blocks even before the MS had a chance to receive them (better throughput," \
804 " less readable traces)"
Philipp Maier9459ebd2020-09-29 23:31:33 +0200805DEFUN_ATTR(cfg_pcu_dl_tbf_preemptive_retransmission,
806 cfg_pcu_dl_tbf_preemptive_retransmission_cmd,
807 "dl-tbf-preemptive-retransmission",
808 RETRANSMISSION_STR " (enabled by default)",
809 CMD_ATTR_IMMEDIATE)
Oliver Smith45fdc442019-09-05 15:12:20 +0200810{
Pau Espin Pedrol05f9f592021-01-14 12:56:58 +0100811 the_pcu->vty.dl_tbf_preemptive_retransmission = true;
Oliver Smith45fdc442019-09-05 15:12:20 +0200812 return CMD_SUCCESS;
813}
814
Philipp Maier9459ebd2020-09-29 23:31:33 +0200815DEFUN_ATTR(cfg_pcu_no_dl_tbf_preemptive_retransmission,
816 cfg_pcu_no_dl_tbf_preemptive_retransmission_cmd,
817 "no dl-tbf-preemptive-retransmission",
818 NO_STR RETRANSMISSION_STR,
819 CMD_ATTR_IMMEDIATE)
Oliver Smith45fdc442019-09-05 15:12:20 +0200820{
Pau Espin Pedrol05f9f592021-01-14 12:56:58 +0100821 the_pcu->vty.dl_tbf_preemptive_retransmission = false;
Oliver Smith45fdc442019-09-05 15:12:20 +0200822 return CMD_SUCCESS;
823}
824
Jacob Erlbecka098c192015-05-28 16:11:19 +0200825#define MS_IDLE_TIME_STR "keep an idle MS object alive for the time given\n"
Pau Espin Pedrol63700ea2019-09-09 13:19:06 +0200826DEFUN_DEPRECATED(cfg_pcu_ms_idle_time,
Jacob Erlbecka098c192015-05-28 16:11:19 +0200827 cfg_pcu_ms_idle_time_cmd,
828 "ms-idle-time <1-7200>",
829 MS_IDLE_TIME_STR "idle time in sec")
830{
Pau Espin Pedrol63700ea2019-09-09 13:19:06 +0200831 vty_out(vty, "%% 'ms-idle-time' is now deprecated: use 'timer X2030 <val>' instead%s", VTY_NEWLINE);
Pau Espin Pedrol924aaad2021-01-14 12:01:42 +0100832 if (osmo_tdef_set(the_pcu->T_defs, -2030, atoi(argv[0]), OSMO_TDEF_S) < 0)
Pau Espin Pedrol63700ea2019-09-09 13:19:06 +0200833 return CMD_WARNING;
Jacob Erlbecka098c192015-05-28 16:11:19 +0200834 return CMD_SUCCESS;
835}
836
Pau Espin Pedrol63700ea2019-09-09 13:19:06 +0200837DEFUN_DEPRECATED(cfg_pcu_no_ms_idle_time,
Jacob Erlbecka098c192015-05-28 16:11:19 +0200838 cfg_pcu_no_ms_idle_time_cmd,
839 "no ms-idle-time",
840 NO_STR MS_IDLE_TIME_STR)
841{
Pau Espin Pedrol63700ea2019-09-09 13:19:06 +0200842 vty_out(vty, "%% 'no ms-idle-time' is now deprecated: use 'timer X2030 0' instead%s", VTY_NEWLINE);
Pau Espin Pedrol924aaad2021-01-14 12:01:42 +0100843 if (osmo_tdef_set(the_pcu->T_defs, -2030, 0, OSMO_TDEF_S) < 0)
Pau Espin Pedrol63700ea2019-09-09 13:19:06 +0200844 return CMD_WARNING;
Jacob Erlbecka098c192015-05-28 16:11:19 +0200845 return CMD_SUCCESS;
846}
847
Pau Espin Pedrol1e6eb302019-11-28 17:00:44 +0100848#define CS_ERR_LIMITS_STR "set thresholds for error rate based downlink (M)CS adjustment\n"
Philipp Maier9459ebd2020-09-29 23:31:33 +0200849DEFUN_ATTR(cfg_pcu_cs_err_limits,
850 cfg_pcu_cs_err_limits_cmd,
851 "cs threshold <0-100> <0-100>",
852 CS_STR CS_ERR_LIMITS_STR "lower limit in %\n" "upper limit in %\n",
853 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200854{
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200855 uint8_t lower_limit = atoi(argv[0]);
856 uint8_t upper_limit = atoi(argv[1]);
857
858 if (lower_limit > upper_limit) {
859 vty_out(vty,
860 "The lower limit must be less than or equal to the "
861 "upper limit.%s", VTY_NEWLINE);
862 return CMD_WARNING;
863 }
864
Pau Espin Pedrole8dcf642021-01-14 13:17:01 +0100865 the_pcu->vty.cs_adj_enabled = true;
866 the_pcu->vty.cs_adj_upper_limit = upper_limit;
867 the_pcu->vty.cs_adj_lower_limit = lower_limit;
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200868
869 return CMD_SUCCESS;
870}
871
Philipp Maier9459ebd2020-09-29 23:31:33 +0200872DEFUN_ATTR(cfg_pcu_no_cs_err_limits,
873 cfg_pcu_no_cs_err_limits_cmd,
874 "no cs threshold",
875 NO_STR CS_STR CS_ERR_LIMITS_STR,
876 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200877{
Pau Espin Pedrole8dcf642021-01-14 13:17:01 +0100878 the_pcu->vty.cs_adj_enabled = false;
879 the_pcu->vty.cs_adj_upper_limit = 100;
880 the_pcu->vty.cs_adj_lower_limit = 0;
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200881
882 return CMD_SUCCESS;
883}
884
Pau Espin Pedrol1e6eb302019-11-28 17:00:44 +0100885#define CS_DOWNGRADE_STR "set threshold for data size based downlink (M)CS downgrade\n"
Philipp Maier9459ebd2020-09-29 23:31:33 +0200886DEFUN_ATTR(cfg_pcu_cs_downgrade_thrsh,
887 cfg_pcu_cs_downgrade_thrsh_cmd,
888 "cs downgrade-threshold <1-10000>",
889 CS_STR CS_DOWNGRADE_STR "downgrade if less octets left\n",
890 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +0200891{
Pau Espin Pedrolad79b852021-01-14 13:20:55 +0100892 the_pcu->vty.cs_downgrade_threshold = atoi(argv[0]);
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +0200893 return CMD_SUCCESS;
894}
895
Philipp Maier9459ebd2020-09-29 23:31:33 +0200896DEFUN_ATTR(cfg_pcu_no_cs_downgrade_thrsh,
897 cfg_pcu_no_cs_downgrade_thrsh_cmd,
898 "no cs downgrade-threshold",
899 NO_STR CS_STR CS_DOWNGRADE_STR,
900 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +0200901{
Pau Espin Pedrolad79b852021-01-14 13:20:55 +0100902 the_pcu->vty.cs_downgrade_threshold = 0;
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +0200903 return CMD_SUCCESS;
904}
905
Philipp Maier9459ebd2020-09-29 23:31:33 +0200906DEFUN_ATTR(cfg_pcu_cs_lqual_ranges,
907 cfg_pcu_cs_lqual_ranges_cmd,
908 "cs link-quality-ranges cs1 <0-35> cs2 <0-35> <0-35> cs3 <0-35> <0-35> cs4 <0-35>",
909 CS_STR "Set link quality ranges for each uplink CS\n"
910 "Set quality range for CS-1 (high value only)\n"
911 "CS-1 high (dB)\n"
912 "Set quality range for CS-2\n"
913 "CS-2 low (dB)\n"
914 "CS-2 high (dB)\n"
915 "Set quality range for CS-3\n"
916 "CS-3 low (dB)\n"
917 "CS-3 high (dB)\n"
918 "Set quality range for CS-4 (low value only)\n"
919 "CS-4 low (dB)\n",
920 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck94cde132015-06-09 09:44:36 +0200921{
Jacob Erlbeck94cde132015-06-09 09:44:36 +0200922 uint8_t cs1_high = atoi(argv[0]);
923 uint8_t cs2_low = atoi(argv[1]);
924 uint8_t cs2_high = atoi(argv[2]);
925 uint8_t cs3_low = atoi(argv[3]);
926 uint8_t cs3_high = atoi(argv[4]);
927 uint8_t cs4_low = atoi(argv[5]);
928
Pau Espin Pedrol54b159a2021-01-14 13:30:04 +0100929 the_pcu->vty.cs_lqual_ranges[0].high = cs1_high;
930 the_pcu->vty.cs_lqual_ranges[1].low = cs2_low;
931 the_pcu->vty.cs_lqual_ranges[1].high = cs2_high;
932 the_pcu->vty.cs_lqual_ranges[2].low = cs3_low;
933 the_pcu->vty.cs_lqual_ranges[2].high = cs3_high;
934 the_pcu->vty.cs_lqual_ranges[3].low = cs4_low;
Jacob Erlbeck94cde132015-06-09 09:44:36 +0200935
936 return CMD_SUCCESS;
937}
938
Philipp Maier9459ebd2020-09-29 23:31:33 +0200939DEFUN_ATTR(cfg_pcu_mcs_lqual_ranges,
940 cfg_pcu_mcs_lqual_ranges_cmd,
941 "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>",
942 CS_STR "Set link quality ranges for each uplink MCS\n"
943 "Set quality range for MCS-1 (high value only)\n"
944 "MCS-1 high (dB)\n"
945 "Set quality range for MCS-2\n"
946 "MCS-2 high (dB)\n"
947 "MCS-2 low (dB)\n"
948 "Set quality range for MCS-3\n"
949 "MCS-3 high (dB)\n"
950 "MCS-3 low (dB)\n"
951 "Set quality range for MCS-4\n"
952 "MCS-4 high (dB)\n"
953 "MCS-4 low (dB)\n"
954 "Set quality range for MCS-5\n"
955 "MCS-5 high (dB)\n"
956 "MCS-5 low (dB)\n"
957 "Set quality range for MCS-6\n"
958 "MCS-6 low (dB)\n"
959 "MCS-6 high (dB)\n"
960 "Set quality range for MCS-7\n"
961 "MCS-7 low (dB)\n"
962 "MCS-7 high (dB)\n"
963 "Set quality range for MCS-8\n"
964 "MCS-8 low (dB)\n"
965 "MCS-8 high (dB)\n"
966 "Set quality range for MCS-9 (low value only)\n"
967 "MCS-9 low (dB)\n",
968 CMD_ATTR_IMMEDIATE)
Minh-Quang Nguyen1f189092017-08-16 09:50:06 -0400969{
Pau Espin Pedrol54b159a2021-01-14 13:30:04 +0100970 the_pcu->vty.mcs_lqual_ranges[0].high = atoi(argv[0]);
971 the_pcu->vty.mcs_lqual_ranges[1].low = atoi(argv[1]);
972 the_pcu->vty.mcs_lqual_ranges[1].high = atoi(argv[2]);
973 the_pcu->vty.mcs_lqual_ranges[2].low = atoi(argv[3]);
974 the_pcu->vty.mcs_lqual_ranges[2].high = atoi(argv[4]);
975 the_pcu->vty.mcs_lqual_ranges[3].low = atoi(argv[5]);
976 the_pcu->vty.mcs_lqual_ranges[3].high = atoi(argv[6]);
977 the_pcu->vty.mcs_lqual_ranges[4].low = atoi(argv[7]);
978 the_pcu->vty.mcs_lqual_ranges[4].high = atoi(argv[8]);
979 the_pcu->vty.mcs_lqual_ranges[5].low = atoi(argv[9]);
980 the_pcu->vty.mcs_lqual_ranges[5].high = atoi(argv[10]);
981 the_pcu->vty.mcs_lqual_ranges[6].low = atoi(argv[11]);
982 the_pcu->vty.mcs_lqual_ranges[6].high = atoi(argv[12]);
983 the_pcu->vty.mcs_lqual_ranges[7].low = atoi(argv[13]);
984 the_pcu->vty.mcs_lqual_ranges[7].high = atoi(argv[14]);
985 the_pcu->vty.mcs_lqual_ranges[8].low = atoi(argv[15]);
Minh-Quang Nguyen1f189092017-08-16 09:50:06 -0400986
987 return CMD_SUCCESS;
988}
989
Pau Espin Pedrolc4178e52017-08-08 15:03:50 +0200990DEFUN(cfg_pcu_sock,
991 cfg_pcu_sock_cmd,
992 "pcu-socket PATH",
993 "Configure the osmo-bts PCU socket file/path name\n"
994 "Path of the socket to connect to\n")
995{
Vadim Yanitskiyfc75cc02019-11-30 20:13:25 +0700996 if (vty->type != VTY_FILE)
997 vty_out(vty, "Changing PCU socket path at run-time has no effect%s", VTY_NEWLINE);
998
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100999 osmo_talloc_replace_string(tall_pcu_ctx, &the_pcu->pcu_sock_path, argv[0]);
Pau Espin Pedrolc4178e52017-08-08 15:03:50 +02001000
1001 return CMD_SUCCESS;
1002}
Jacob Erlbeck94cde132015-06-09 09:44:36 +02001003
Philipp Maier9459ebd2020-09-29 23:31:33 +02001004DEFUN_USRATTR(cfg_pcu_gb_dialect,
1005 cfg_pcu_gb_dialect_cmd,
1006 X(PCU_VTY_ATTR_NS_RESET),
1007 "gb-dialect (classic|ip-sns)",
1008 "Select which Gb interface dialect to use\n"
1009 "Classic Gb interface with NS-{RESET,BLOCK,UNBLOCK} and static configuration\n"
1010 "Modern Gb interface with IP-SNS (Sub Network Service) and dynamic configuration\n")
Harald Welte57d35152018-07-05 03:11:17 +02001011{
Alexander Couzens290d9032020-09-16 21:52:02 +02001012 if (!strcmp(argv[0], "ip-sns")) {
Pau Espin Pedrol113fb412021-01-14 13:36:02 +01001013 the_pcu->vty.ns_dialect = NS2_DIALECT_SNS;
Alexander Couzens290d9032020-09-16 21:52:02 +02001014 } else {
Pau Espin Pedrol113fb412021-01-14 13:36:02 +01001015 the_pcu->vty.ns_dialect = NS2_DIALECT_IPACCESS;
Alexander Couzens290d9032020-09-16 21:52:02 +02001016 }
Harald Welte57d35152018-07-05 03:11:17 +02001017
1018 return CMD_SUCCESS;
1019}
1020
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +02001021DEFUN(show_bts_timer, show_bts_timer_cmd,
1022 "show bts-timer " OSMO_TDEF_VTY_ARG_T_OPTIONAL,
1023 SHOW_STR "Show BTS controlled timers\n"
1024 OSMO_TDEF_VTY_DOC_T)
1025{
Pau Espin Pedrold1049dc2021-01-18 17:14:14 +01001026 struct gprs_rlcmac_bts *bts;
1027 llist_for_each_entry(bts, &the_pcu->bts_list, list) {
1028 const char *T_arg = argc > 0 ? argv[0] : NULL;
1029 vty_out(vty, "BTS%" PRIu8 ":%s", bts->nr, VTY_NEWLINE);
1030 osmo_tdef_vty_show_cmd(vty, bts->T_defs_bts, T_arg, " ");
1031 }
1032 return CMD_SUCCESS;
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +02001033}
1034
1035DEFUN(show_timer, show_timer_cmd,
1036 "show timer " OSMO_TDEF_VTY_ARG_T_OPTIONAL,
1037 SHOW_STR "Show PCU timers\n"
1038 OSMO_TDEF_VTY_DOC_T)
1039{
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +02001040 const char *T_arg = argc > 0 ? argv[0] : NULL;
Pau Espin Pedrol924aaad2021-01-14 12:01:42 +01001041 return osmo_tdef_vty_show_cmd(vty, the_pcu->T_defs, T_arg, NULL);
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +02001042}
1043
Philipp Maier9459ebd2020-09-29 23:31:33 +02001044DEFUN_ATTR(cfg_pcu_timer, cfg_pcu_timer_cmd,
1045 "timer " OSMO_TDEF_VTY_ARG_SET_OPTIONAL,
1046 "Configure or show PCU timers\n"
1047 OSMO_TDEF_VTY_DOC_SET,
1048 CMD_ATTR_IMMEDIATE)
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +02001049{
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +02001050 /* If any arguments are missing, redirect to 'show' */
1051 if (argc < 2)
1052 return show_timer(self, vty, argc, argv);
Pau Espin Pedrol924aaad2021-01-14 12:01:42 +01001053 return osmo_tdef_vty_set_cmd(vty, the_pcu->T_defs, argv);
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +02001054}
1055
Daniel Willmann772415f2014-01-15 17:06:51 +01001056DEFUN(show_tbf,
1057 show_tbf_cmd,
Max12a09872018-02-01 16:07:33 +01001058 "show tbf (all|ccch|pacch)",
1059 SHOW_STR "information about TBFs\n"
1060 "All TBFs\n"
1061 "TBFs allocated via CCCH\n"
1062 "TBFs allocated via PACCH\n")
Daniel Willmann772415f2014-01-15 17:06:51 +01001063{
Pau Espin Pedrold1049dc2021-01-18 17:14:14 +01001064 struct gprs_rlcmac_bts *bts;
1065 llist_for_each_entry(bts, &the_pcu->bts_list, list) {
1066 uint32_t flags = UINT32_MAX;
Max12a09872018-02-01 16:07:33 +01001067
Pau Espin Pedrold1049dc2021-01-18 17:14:14 +01001068 if (argv[0][0] == 'c')
1069 flags = (1 << GPRS_RLCMAC_FLAG_CCCH);
1070 else if (argv[0][0] == 'p')
1071 flags = (1 << GPRS_RLCMAC_FLAG_PACCH);
Max12a09872018-02-01 16:07:33 +01001072
Pau Espin Pedrold1049dc2021-01-18 17:14:14 +01001073 pcu_vty_show_tbf_all(vty, bts, flags);
1074 }
1075 return CMD_SUCCESS;
Daniel Willmann772415f2014-01-15 17:06:51 +01001076}
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +01001077
Jacob Erlbeckf47f68a2015-06-04 10:23:24 +02001078DEFUN(show_ms_all,
1079 show_ms_all_cmd,
1080 "show ms all",
1081 SHOW_STR "information about MSs\n" "All TBFs\n")
1082{
Pau Espin Pedrold1049dc2021-01-18 17:14:14 +01001083 struct gprs_rlcmac_bts *bts;
1084 llist_for_each_entry(bts, &the_pcu->bts_list, list) {
1085 pcu_vty_show_ms_all(vty, bts);
1086 }
1087 return CMD_SUCCESS;
Jacob Erlbeckf47f68a2015-06-04 10:23:24 +02001088}
1089
Jacob Erlbeck37e896d2015-06-05 16:33:33 +02001090DEFUN(show_ms_tlli,
1091 show_ms_tlli_cmd,
1092 "show ms tlli TLLI",
1093 SHOW_STR "information about MSs\n" "Select MS by TLLI\n" "TLLI as hex\n")
1094{
Pau Espin Pedrold1049dc2021-01-18 17:14:14 +01001095 struct gprs_rlcmac_bts *bts;
1096 llist_for_each_entry(bts, &the_pcu->bts_list, list) {
1097 char *endp = NULL;
1098 unsigned long long tlli = strtoll(argv[0], &endp, 16);
1099 if ((endp != NULL && *endp != 0) || tlli > 0xffffffffULL) {
1100 vty_out(vty, "Invalid TLLI.%s", VTY_NEWLINE);
1101 return CMD_WARNING;
1102 }
1103 pcu_vty_show_ms_by_tlli(vty, bts, (uint32_t)tlli);
Jacob Erlbeck37e896d2015-06-05 16:33:33 +02001104 }
Pau Espin Pedrold1049dc2021-01-18 17:14:14 +01001105 return CMD_SUCCESS;
Jacob Erlbeck37e896d2015-06-05 16:33:33 +02001106}
1107
1108DEFUN(show_ms_imsi,
1109 show_ms_imsi_cmd,
1110 "show ms imsi IMSI",
1111 SHOW_STR "information about MSs\n" "Select MS by IMSI\n" "IMSI\n")
1112{
Pau Espin Pedrold1049dc2021-01-18 17:14:14 +01001113 struct gprs_rlcmac_bts *bts;
1114 llist_for_each_entry(bts, &the_pcu->bts_list, list) {
1115 pcu_vty_show_ms_by_imsi(vty, bts, argv[0]);
1116 }
1117 return CMD_SUCCESS;
Jacob Erlbeck37e896d2015-06-05 16:33:33 +02001118}
1119
Andreas Eversberg12942562012-07-12 14:31:57 +02001120static const char pcu_copyright[] =
Harald Welted1e340f2013-01-17 12:24:29 +01001121 "Copyright (C) 2012 by Ivan Kluchnikov <kluchnikovi@gmail.com> and \r\n"
1122 " Andreas Eversberg <jolly@eversberg.eu>\r\n"
Andreas Eversberg12942562012-07-12 14:31:57 +02001123 "License GNU GPL version 2 or later\r\n"
1124 "This is free software: you are free to change and redistribute it.\r\n"
1125 "There is NO WARRANTY, to the extent permitted by law.\r\n";
1126
1127struct vty_app_info pcu_vty_info = {
Pau Espin Pedrold0fc9e82019-11-29 13:37:45 +01001128 .name = "OsmoPCU",
Andreas Eversberg12942562012-07-12 14:31:57 +02001129 .version = PACKAGE_VERSION,
1130 .copyright = pcu_copyright,
Philipp Maier9459ebd2020-09-29 23:31:33 +02001131 .usr_attr_desc = {
1132 [PCU_VTY_ATTR_NEW_TBF] = \
1133 "This command applies when a new TBF is begins",
1134 [PCU_VTY_ATTR_NEW_SUBSCR] = \
1135 "This command applies when a new subscriber attaches",
1136 [PCU_VTY_ATTR_NS_RESET] = \
1137 "This command applies when the NS is reset",
1138 },
1139 .usr_attr_letters = {
1140 [PCU_VTY_ATTR_NEW_TBF] = 'n',
1141 [PCU_VTY_ATTR_NEW_SUBSCR] = 's',
1142 [PCU_VTY_ATTR_NS_RESET] = 'r',
1143 },
Andreas Eversberg12942562012-07-12 14:31:57 +02001144};
1145
Pau Espin Pedrolcd2ac562019-08-05 14:30:44 +02001146int pcu_vty_init(void)
Andreas Eversberg12942562012-07-12 14:31:57 +02001147{
1148// install_element_ve(&show_pcu_cmd);
1149
Harald Welte717cdf52017-07-21 21:56:23 +02001150 cfg_pcu_gsmtap_categ_cmd.string = vty_cmd_string_from_valstr(tall_pcu_ctx, pcu_gsmtap_categ_names,
1151 "gsmtap-category (",
1152 "|",")", VTY_DO_LOWER);
1153 cfg_pcu_gsmtap_categ_cmd.doc = vty_cmd_string_from_valstr(tall_pcu_ctx, pcu_gsmtap_categ_help,
1154 "GSMTAP Category\n",
1155 "\n", "", 0);
1156 cfg_pcu_no_gsmtap_categ_cmd.string = vty_cmd_string_from_valstr(tall_pcu_ctx, pcu_gsmtap_categ_names,
1157 "no gsmtap-category (",
1158 "|",")", VTY_DO_LOWER);
1159 cfg_pcu_no_gsmtap_categ_cmd.doc = vty_cmd_string_from_valstr(tall_pcu_ctx, pcu_gsmtap_categ_help,
1160 NO_STR "GSMTAP Category\n",
1161 "\n", "", 0);
1162
Pau Espin Pedrolcd2ac562019-08-05 14:30:44 +02001163 logging_vty_add_cmds();
1164 osmo_stats_vty_add_cmds();
Vadim Yanitskiyd83c8ff2020-02-06 16:46:17 +07001165 osmo_talloc_vty_add_cmds();
Andreas Eversberg12942562012-07-12 14:31:57 +02001166
Andreas Eversberg8b761a32012-07-20 21:50:31 +02001167 install_node(&pcu_node, config_write_pcu);
1168 install_element(CONFIG_NODE, &cfg_pcu_cmd);
Jacob Erlbeck953c7892015-09-28 18:12:57 +02001169 install_element(PCU_NODE, &cfg_pcu_egprs_cmd);
1170 install_element(PCU_NODE, &cfg_pcu_no_egprs_cmd);
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +02001171 install_element(PCU_NODE, &cfg_pcu_no_two_phase_cmd);
Andreas Eversberg8b761a32012-07-20 21:50:31 +02001172 install_element(PCU_NODE, &cfg_pcu_cs_cmd);
1173 install_element(PCU_NODE, &cfg_pcu_no_cs_cmd);
Jacob Erlbeckb33e6752015-06-04 19:04:30 +02001174 install_element(PCU_NODE, &cfg_pcu_cs_max_cmd);
1175 install_element(PCU_NODE, &cfg_pcu_no_cs_max_cmd);
Jacob Erlbeck8322d082015-06-04 15:12:10 +02001176 install_element(PCU_NODE, &cfg_pcu_cs_err_limits_cmd);
1177 install_element(PCU_NODE, &cfg_pcu_no_cs_err_limits_cmd);
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +02001178 install_element(PCU_NODE, &cfg_pcu_cs_downgrade_thrsh_cmd);
1179 install_element(PCU_NODE, &cfg_pcu_no_cs_downgrade_thrsh_cmd);
Jacob Erlbeck94cde132015-06-09 09:44:36 +02001180 install_element(PCU_NODE, &cfg_pcu_cs_lqual_ranges_cmd);
Minh-Quang Nguyen1f189092017-08-16 09:50:06 -04001181 install_element(PCU_NODE, &cfg_pcu_mcs_lqual_ranges_cmd);
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +01001182 install_element(PCU_NODE, &cfg_pcu_mcs_cmd);
Aravind Sirsikar50b09702016-08-22 17:21:10 +05301183 install_element(PCU_NODE, &cfg_pcu_dl_arq_cmd);
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +01001184 install_element(PCU_NODE, &cfg_pcu_no_mcs_cmd);
Jacob Erlbeck0d058052016-01-07 11:48:28 +01001185 install_element(PCU_NODE, &cfg_pcu_mcs_max_cmd);
1186 install_element(PCU_NODE, &cfg_pcu_no_mcs_max_cmd);
Jacob Erlbeck36df7742016-01-19 15:53:30 +01001187 install_element(PCU_NODE, &cfg_pcu_window_size_cmd);
Andreas Eversberg24131bf2012-07-21 11:09:58 +02001188 install_element(PCU_NODE, &cfg_pcu_queue_lifetime_cmd);
1189 install_element(PCU_NODE, &cfg_pcu_queue_lifetime_inf_cmd);
1190 install_element(PCU_NODE, &cfg_pcu_no_queue_lifetime_cmd);
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +01001191 install_element(PCU_NODE, &cfg_pcu_queue_hysteresis_cmd);
1192 install_element(PCU_NODE, &cfg_pcu_no_queue_hysteresis_cmd);
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +02001193 install_element(PCU_NODE, &cfg_pcu_queue_codel_cmd);
1194 install_element(PCU_NODE, &cfg_pcu_queue_codel_interval_cmd);
1195 install_element(PCU_NODE, &cfg_pcu_no_queue_codel_cmd);
Jacob Erlbeckd0261b72015-04-02 13:58:09 +02001196 install_element(PCU_NODE, &cfg_pcu_queue_idle_ack_delay_cmd);
1197 install_element(PCU_NODE, &cfg_pcu_no_queue_idle_ack_delay_cmd);
Andreas Eversberga1503fa2012-07-22 08:58:09 +02001198 install_element(PCU_NODE, &cfg_pcu_alloc_cmd);
Andreas Eversberg07e97cf2012-08-07 16:00:56 +02001199 install_element(PCU_NODE, &cfg_pcu_two_phase_cmd);
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +02001200 install_element(PCU_NODE, &cfg_pcu_fc_interval_cmd);
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +02001201 install_element(PCU_NODE, &cfg_pcu_fc_bucket_time_cmd);
1202 install_element(PCU_NODE, &cfg_pcu_no_fc_bucket_time_cmd);
Jacob Erlbeck87d73412015-04-21 12:56:48 +02001203 install_element(PCU_NODE, &cfg_pcu_fc_bvc_bucket_size_cmd);
1204 install_element(PCU_NODE, &cfg_pcu_no_fc_bvc_bucket_size_cmd);
1205 install_element(PCU_NODE, &cfg_pcu_fc_bvc_leak_rate_cmd);
1206 install_element(PCU_NODE, &cfg_pcu_no_fc_bvc_leak_rate_cmd);
1207 install_element(PCU_NODE, &cfg_pcu_fc_ms_bucket_size_cmd);
1208 install_element(PCU_NODE, &cfg_pcu_no_fc_ms_bucket_size_cmd);
1209 install_element(PCU_NODE, &cfg_pcu_fc_ms_leak_rate_cmd);
1210 install_element(PCU_NODE, &cfg_pcu_no_fc_ms_leak_rate_cmd);
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +02001211 install_element(PCU_NODE, &cfg_pcu_alpha_cmd);
1212 install_element(PCU_NODE, &cfg_pcu_gamma_cmd);
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +01001213 install_element(PCU_NODE, &cfg_pcu_dl_tbf_idle_time_cmd);
1214 install_element(PCU_NODE, &cfg_pcu_no_dl_tbf_idle_time_cmd);
Oliver Smith45fdc442019-09-05 15:12:20 +02001215 install_element(PCU_NODE, &cfg_pcu_dl_tbf_preemptive_retransmission_cmd);
1216 install_element(PCU_NODE, &cfg_pcu_no_dl_tbf_preemptive_retransmission_cmd);
Jacob Erlbecka098c192015-05-28 16:11:19 +02001217 install_element(PCU_NODE, &cfg_pcu_ms_idle_time_cmd);
1218 install_element(PCU_NODE, &cfg_pcu_no_ms_idle_time_cmd);
Harald Welte717cdf52017-07-21 21:56:23 +02001219 install_element(PCU_NODE, &cfg_pcu_gsmtap_categ_cmd);
1220 install_element(PCU_NODE, &cfg_pcu_no_gsmtap_categ_cmd);
Pau Espin Pedrolc4178e52017-08-08 15:03:50 +02001221 install_element(PCU_NODE, &cfg_pcu_sock_cmd);
Harald Welte57d35152018-07-05 03:11:17 +02001222 install_element(PCU_NODE, &cfg_pcu_gb_dialect_cmd);
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +02001223 install_element(PCU_NODE, &cfg_pcu_timer_cmd);
Andreas Eversberg8b761a32012-07-20 21:50:31 +02001224
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +01001225 install_element_ve(&show_bts_stats_cmd);
Pau Espin Pedrola1ac2f02020-09-22 17:01:31 +02001226 install_element_ve(&show_bts_pdch_cmd);
Daniel Willmann772415f2014-01-15 17:06:51 +01001227 install_element_ve(&show_tbf_cmd);
Jacob Erlbeckf47f68a2015-06-04 10:23:24 +02001228 install_element_ve(&show_ms_all_cmd);
Jacob Erlbeck37e896d2015-06-05 16:33:33 +02001229 install_element_ve(&show_ms_tlli_cmd);
1230 install_element_ve(&show_ms_imsi_cmd);
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +02001231 install_element_ve(&show_bts_timer_cmd);
1232 install_element_ve(&show_timer_cmd);
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +01001233
Andreas Eversberg12942562012-07-12 14:31:57 +02001234 return 0;
1235}