blob: ed1a6a4a38f71e480cd1ccb33b5f276667b61468 [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{
Harald Welte717cdf52017-07-21 21:56:23 +0200105 unsigned int i;
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200106
107 vty_out(vty, "pcu%s", VTY_NEWLINE);
Pau Espin Pedrole8912222021-01-14 14:03:17 +0100108 vty_out(vty, " flow-control-interval %d%s", the_pcu->vty.fc_interval,
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200109 VTY_NEWLINE);
Pau Espin Pedrole8912222021-01-14 14:03:17 +0100110 if (the_pcu->vty.fc_bvc_bucket_size)
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200111 vty_out(vty, " flow-control force-bvc-bucket-size %d%s",
Pau Espin Pedrole8912222021-01-14 14:03:17 +0100112 the_pcu->vty.fc_bvc_bucket_size, VTY_NEWLINE);
113 if (the_pcu->vty.fc_bvc_leak_rate)
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200114 vty_out(vty, " flow-control force-bvc-leak-rate %d%s",
Pau Espin Pedrole8912222021-01-14 14:03:17 +0100115 the_pcu->vty.fc_bvc_leak_rate, VTY_NEWLINE);
116 if (the_pcu->vty.fc_ms_bucket_size)
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200117 vty_out(vty, " flow-control force-ms-bucket-size %d%s",
Pau Espin Pedrole8912222021-01-14 14:03:17 +0100118 the_pcu->vty.fc_ms_bucket_size, VTY_NEWLINE);
119 if (the_pcu->vty.fc_ms_leak_rate)
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200120 vty_out(vty, " flow-control force-ms-leak-rate %d%s",
Pau Espin Pedrole8912222021-01-14 14:03:17 +0100121 the_pcu->vty.fc_ms_leak_rate, VTY_NEWLINE);
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100122 if (the_pcu->vty.force_initial_cs) {
Pau Espin Pedrol793583e2021-01-14 16:20:57 +0100123 if (the_pcu->vty.initial_cs_ul == the_pcu->vty.initial_cs_dl)
124 vty_out(vty, " cs %d%s", the_pcu->vty.initial_cs_dl,
Andreas Eversberg499ff412012-10-03 14:21:36 +0200125 VTY_NEWLINE);
126 else
Pau Espin Pedrol793583e2021-01-14 16:20:57 +0100127 vty_out(vty, " cs %d %d%s", the_pcu->vty.initial_cs_dl,
128 the_pcu->vty.initial_cs_ul, VTY_NEWLINE);
Holger Hans Peter Freytherc421e8a2014-07-02 14:55:17 +0200129 }
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100130 if (the_pcu->vty.max_cs_dl && the_pcu->vty.max_cs_ul) {
131 if (the_pcu->vty.max_cs_ul == the_pcu->vty.max_cs_dl)
132 vty_out(vty, " cs max %d%s", the_pcu->vty.max_cs_dl,
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200133 VTY_NEWLINE);
134 else
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100135 vty_out(vty, " cs max %d %d%s", the_pcu->vty.max_cs_dl,
136 the_pcu->vty.max_cs_ul, VTY_NEWLINE);
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200137 }
Pau Espin Pedrole8dcf642021-01-14 13:17:01 +0100138 if (the_pcu->vty.cs_adj_enabled)
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200139 vty_out(vty, " cs threshold %d %d%s",
Pau Espin Pedrole8dcf642021-01-14 13:17:01 +0100140 the_pcu->vty.cs_adj_lower_limit, the_pcu->vty.cs_adj_upper_limit,
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200141 VTY_NEWLINE);
142 else
143 vty_out(vty, " no cs threshold%s", VTY_NEWLINE);
144
Pau Espin Pedrolad79b852021-01-14 13:20:55 +0100145 if (the_pcu->vty.cs_downgrade_threshold)
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +0200146 vty_out(vty, " cs downgrade-threshold %d%s",
Pau Espin Pedrolad79b852021-01-14 13:20:55 +0100147 the_pcu->vty.cs_downgrade_threshold, VTY_NEWLINE);
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +0200148 else
149 vty_out(vty, " no cs downgrade-threshold%s", VTY_NEWLINE);
150
Jacob Erlbeck94cde132015-06-09 09:44:36 +0200151 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 +0100152 the_pcu->vty.cs_lqual_ranges[0].high,
153 the_pcu->vty.cs_lqual_ranges[1].low,
154 the_pcu->vty.cs_lqual_ranges[1].high,
155 the_pcu->vty.cs_lqual_ranges[2].low,
156 the_pcu->vty.cs_lqual_ranges[2].high,
157 the_pcu->vty.cs_lqual_ranges[3].low,
Jacob Erlbeck94cde132015-06-09 09:44:36 +0200158 VTY_NEWLINE);
159
Minh-Quang Nguyen1f189092017-08-16 09:50:06 -0400160 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 +0100161 the_pcu->vty.mcs_lqual_ranges[0].high,
162 the_pcu->vty.mcs_lqual_ranges[1].low,
163 the_pcu->vty.mcs_lqual_ranges[1].high,
164 the_pcu->vty.mcs_lqual_ranges[2].low,
165 the_pcu->vty.mcs_lqual_ranges[2].high,
166 the_pcu->vty.mcs_lqual_ranges[3].low,
167 the_pcu->vty.mcs_lqual_ranges[3].high,
168 the_pcu->vty.mcs_lqual_ranges[4].low,
169 the_pcu->vty.mcs_lqual_ranges[4].high,
170 the_pcu->vty.mcs_lqual_ranges[5].low,
171 the_pcu->vty.mcs_lqual_ranges[5].high,
172 the_pcu->vty.mcs_lqual_ranges[6].low,
173 the_pcu->vty.mcs_lqual_ranges[6].high,
174 the_pcu->vty.mcs_lqual_ranges[7].low,
175 the_pcu->vty.mcs_lqual_ranges[7].high,
176 the_pcu->vty.mcs_lqual_ranges[8].low,
Minh-Quang Nguyen1f189092017-08-16 09:50:06 -0400177 VTY_NEWLINE);
178
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100179 if (the_pcu->vty.force_initial_mcs) {
Pau Espin Pedrol793583e2021-01-14 16:20:57 +0100180 if (the_pcu->vty.initial_mcs_ul == the_pcu->vty.initial_mcs_dl)
181 vty_out(vty, " mcs %d%s", the_pcu->vty.initial_mcs_dl,
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +0100182 VTY_NEWLINE);
183 else
Pau Espin Pedrol793583e2021-01-14 16:20:57 +0100184 vty_out(vty, " mcs %d %d%s", the_pcu->vty.initial_mcs_dl,
185 the_pcu->vty.initial_mcs_ul, VTY_NEWLINE);
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +0100186 }
Minh-Quang Nguyen1f189092017-08-16 09:50:06 -0400187
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100188 if (the_pcu->vty.max_mcs_dl && the_pcu->vty.max_mcs_ul) {
189 if (the_pcu->vty.max_mcs_ul == the_pcu->vty.max_mcs_dl)
190 vty_out(vty, " mcs max %d%s", the_pcu->vty.max_mcs_dl,
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100191 VTY_NEWLINE);
192 else
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100193 vty_out(vty, " mcs max %d %d%s", the_pcu->vty.max_mcs_dl,
194 the_pcu->vty.max_mcs_ul, VTY_NEWLINE);
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100195 }
196
Pau Espin Pedrol519d0712021-01-14 14:30:03 +0100197 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 +0100198 VTY_NEWLINE);
199
Pau Espin Pedrol97296b22021-01-14 13:08:02 +0100200 if (the_pcu->vty.dl_arq_type == EGPRS_ARQ2)
201 vty_out(vty, " egprs dl arq-type arq2%s", VTY_NEWLINE);
Aravind Sirsikar50b09702016-08-22 17:21:10 +0530202
Pau Espin Pedrolf473ec92021-01-14 14:45:14 +0100203 if (the_pcu->vty.force_llc_lifetime == 0xffff)
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200204 vty_out(vty, " queue lifetime infinite%s", VTY_NEWLINE);
Pau Espin Pedrolf473ec92021-01-14 14:45:14 +0100205 else if (the_pcu->vty.force_llc_lifetime)
206 vty_out(vty, " queue lifetime %d%s", the_pcu->vty.force_llc_lifetime,
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200207 VTY_NEWLINE);
Pau Espin Pedrolf473ec92021-01-14 14:45:14 +0100208 if (the_pcu->vty.llc_discard_csec)
209 vty_out(vty, " queue hysteresis %d%s", the_pcu->vty.llc_discard_csec,
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100210 VTY_NEWLINE);
Pau Espin Pedrolf473ec92021-01-14 14:45:14 +0100211 if (the_pcu->vty.llc_idle_ack_csec)
212 vty_out(vty, " queue idle-ack-delay %d%s", the_pcu->vty.llc_idle_ack_csec,
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200213 VTY_NEWLINE);
Pau Espin Pedrolf473ec92021-01-14 14:45:14 +0100214 if (the_pcu->vty.llc_codel_interval_msec == LLC_CODEL_USE_DEFAULT)
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200215 vty_out(vty, " queue codel%s", VTY_NEWLINE);
Pau Espin Pedrolf473ec92021-01-14 14:45:14 +0100216 else if (the_pcu->vty.llc_codel_interval_msec == LLC_CODEL_DISABLE)
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200217 vty_out(vty, " no queue codel%s", VTY_NEWLINE);
218 else
219 vty_out(vty, " queue codel interval %d%s",
Pau Espin Pedrolf473ec92021-01-14 14:45:14 +0100220 the_pcu->vty.llc_codel_interval_msec/10, VTY_NEWLINE);
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200221
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100222 if (the_pcu->alloc_algorithm == alloc_algorithm_a)
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200223 vty_out(vty, " alloc-algorithm a%s", VTY_NEWLINE);
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100224 if (the_pcu->alloc_algorithm == alloc_algorithm_b)
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200225 vty_out(vty, " alloc-algorithm b%s", VTY_NEWLINE);
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100226 if (the_pcu->alloc_algorithm == alloc_algorithm_dynamic)
Jacob Erlbeck400ec022015-07-14 13:31:48 +0200227 vty_out(vty, " alloc-algorithm dynamic%s", VTY_NEWLINE);
Pau Espin Pedrol03de8982021-01-14 12:48:50 +0100228 if (the_pcu->vty.force_two_phase)
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200229 vty_out(vty, " two-phase-access%s", VTY_NEWLINE);
Pau Espin Pedrola2814952021-01-14 12:53:53 +0100230 vty_out(vty, " alpha %d%s", the_pcu->vty.alpha, VTY_NEWLINE);
231 vty_out(vty, " gamma %d%s", the_pcu->vty.gamma * 2, VTY_NEWLINE);
Pau Espin Pedrol05f9f592021-01-14 12:56:58 +0100232 if (!the_pcu->vty.dl_tbf_preemptive_retransmission)
Oliver Smith45fdc442019-09-05 15:12:20 +0200233 vty_out(vty, " no dl-tbf-preemptive-retransmission%s", VTY_NEWLINE);
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100234 if (strcmp(the_pcu->pcu_sock_path, PCU_SOCK_DEFAULT))
235 vty_out(vty, " pcu-socket %s%s", the_pcu->pcu_sock_path, VTY_NEWLINE);
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200236
Harald Welte717cdf52017-07-21 21:56:23 +0200237 for (i = 0; i < 32; i++) {
238 unsigned int cs = (1 << i);
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100239 if (the_pcu->gsmtap_categ_mask & cs) {
Harald Welte717cdf52017-07-21 21:56:23 +0200240 vty_out(vty, " gsmtap-category %s%s",
241 get_value_string(pcu_gsmtap_categ_names, i), VTY_NEWLINE);
242 }
243 }
244
Pau Espin Pedrol113fb412021-01-14 13:36:02 +0100245 if (the_pcu->vty.ns_dialect == NS2_DIALECT_SNS)
Harald Welte57d35152018-07-05 03:11:17 +0200246 vty_out(vty, " gb-dialect ip-sns%s", VTY_NEWLINE);
247 else
248 vty_out(vty, " gb-dialect classic%s", VTY_NEWLINE);
249
Pau Espin Pedrol924aaad2021-01-14 12:01:42 +0100250 osmo_tdef_vty_write(vty, the_pcu->T_defs, " timer ");
Pau Espin Pedrol18794422019-09-26 18:25:35 +0200251
Maxc9ce6f92018-01-30 17:53:02 +0100252 return CMD_SUCCESS;
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200253}
254
255/* per-BTS configuration */
Philipp Maier9459ebd2020-09-29 23:31:33 +0200256DEFUN_ATTR(cfg_pcu,
257 cfg_pcu_cmd,
258 "pcu",
259 "BTS specific configure",
260 CMD_ATTR_IMMEDIATE)
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200261{
262 vty->node = PCU_NODE;
263
264 return CMD_SUCCESS;
265}
266
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200267#define EGPRS_STR "EGPRS configuration\n"
268
Pau Espin Pedrol270c9ea2020-10-30 17:15:32 +0100269DEFUN_DEPRECATED(cfg_pcu_egprs,
270 cfg_pcu_egprs_cmd,
271 "egprs only",
272 EGPRS_STR "Use EGPRS and disable plain GPRS\n")
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200273{
Pau Espin Pedrol270c9ea2020-10-30 17:15:32 +0100274 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 +0200275 return CMD_SUCCESS;
276}
277
Pau Espin Pedrol270c9ea2020-10-30 17:15:32 +0100278DEFUN_DEPRECATED(cfg_pcu_no_egprs,
279 cfg_pcu_no_egprs_cmd,
280 "no egprs",
281 NO_STR EGPRS_STR)
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200282{
Pau Espin Pedrol270c9ea2020-10-30 17:15:32 +0100283 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 +0200284 return CMD_SUCCESS;
285}
286
Philipp Maier9459ebd2020-09-29 23:31:33 +0200287DEFUN_ATTR(cfg_pcu_fc_interval,
288 cfg_pcu_fc_interval_cmd,
289 "flow-control-interval <1-10>",
290 "Interval between sending subsequent Flow Control PDUs\n"
291 "Interval time in seconds\n",
292 CMD_ATTR_IMMEDIATE)
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200293{
Pau Espin Pedrole8912222021-01-14 14:03:17 +0100294 the_pcu->vty.fc_interval = atoi(argv[0]);
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200295 return CMD_SUCCESS;
296}
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200297#define FC_STR "BSSGP Flow Control configuration\n"
298#define FC_BMAX_STR(who) "Force a fixed value for the " who " bucket size\n"
299#define FC_LR_STR(who) "Force a fixed value for the " who " leak rate\n"
300
Philipp Maier9459ebd2020-09-29 23:31:33 +0200301DEFUN_ATTR(cfg_pcu_fc_bvc_bucket_size,
302 cfg_pcu_fc_bvc_bucket_size_cmd,
303 "flow-control force-bvc-bucket-size <1-6553500>",
304 FC_STR FC_BMAX_STR("BVC") "Bucket size in octets\n",
305 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200306{
Pau Espin Pedrole8912222021-01-14 14:03:17 +0100307 the_pcu->vty.fc_bvc_bucket_size = atoi(argv[0]);
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200308 return CMD_SUCCESS;
309}
310
Philipp Maier9459ebd2020-09-29 23:31:33 +0200311DEFUN_ATTR(cfg_pcu_no_fc_bvc_bucket_size,
312 cfg_pcu_no_fc_bvc_bucket_size_cmd,
313 "no flow-control force-bvc-bucket-size",
314 NO_STR FC_STR FC_BMAX_STR("BVC"),
315 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200316{
Pau Espin Pedrole8912222021-01-14 14:03:17 +0100317 the_pcu->vty.fc_bvc_bucket_size = 0;
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200318 return CMD_SUCCESS;
319}
320
Philipp Maier9459ebd2020-09-29 23:31:33 +0200321DEFUN_ATTR(cfg_pcu_fc_bvc_leak_rate,
322 cfg_pcu_fc_bvc_leak_rate_cmd,
323 "flow-control force-bvc-leak-rate <1-6553500>",
324 FC_STR FC_LR_STR("BVC") "Leak rate in bit/s\n",
325 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200326{
Pau Espin Pedrole8912222021-01-14 14:03:17 +0100327 the_pcu->vty.fc_bvc_leak_rate = atoi(argv[0]);
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200328
329 return CMD_SUCCESS;
330}
331
Philipp Maier9459ebd2020-09-29 23:31:33 +0200332DEFUN_ATTR(cfg_pcu_no_fc_bvc_leak_rate,
333 cfg_pcu_no_fc_bvc_leak_rate_cmd,
334 "no flow-control force-bvc-leak-rate",
335 NO_STR FC_STR FC_LR_STR("BVC"),
336 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200337{
Pau Espin Pedrole8912222021-01-14 14:03:17 +0100338 the_pcu->vty.fc_bvc_leak_rate = 0;
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200339 return CMD_SUCCESS;
340}
341
Philipp Maier9459ebd2020-09-29 23:31:33 +0200342DEFUN_ATTR(cfg_pcu_fc_ms_bucket_size,
343 cfg_pcu_fc_ms_bucket_size_cmd,
344 "flow-control force-ms-bucket-size <1-6553500>",
345 FC_STR FC_BMAX_STR("default MS") "Bucket size in octets\n",
346 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200347{
Pau Espin Pedrole8912222021-01-14 14:03:17 +0100348 the_pcu->vty.fc_ms_bucket_size = atoi(argv[0]);
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200349 return CMD_SUCCESS;
350}
351
Philipp Maier9459ebd2020-09-29 23:31:33 +0200352DEFUN_ATTR(cfg_pcu_no_fc_ms_bucket_size,
353 cfg_pcu_no_fc_ms_bucket_size_cmd,
354 "no flow-control force-ms-bucket-size",
355 NO_STR FC_STR FC_BMAX_STR("default MS"),
356 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200357{
Pau Espin Pedrole8912222021-01-14 14:03:17 +0100358 the_pcu->vty.fc_ms_bucket_size = 0;
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200359 return CMD_SUCCESS;
360}
361
Philipp Maier9459ebd2020-09-29 23:31:33 +0200362DEFUN_ATTR(cfg_pcu_fc_ms_leak_rate,
363 cfg_pcu_fc_ms_leak_rate_cmd,
364 "flow-control force-ms-leak-rate <1-6553500>",
365 FC_STR FC_LR_STR("default MS") "Leak rate in bit/s\n",
366 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200367{
Pau Espin Pedrole8912222021-01-14 14:03:17 +0100368 the_pcu->vty.fc_ms_leak_rate = atoi(argv[0]);
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200369 return CMD_SUCCESS;
370}
371
Philipp Maier9459ebd2020-09-29 23:31:33 +0200372DEFUN_ATTR(cfg_pcu_no_fc_ms_leak_rate,
373 cfg_pcu_no_fc_ms_leak_rate_cmd,
374 "no flow-control force-ms-leak-rate",
375 NO_STR FC_STR FC_LR_STR("default MS"),
376 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200377{
Pau Espin Pedrole8912222021-01-14 14:03:17 +0100378 the_pcu->vty.fc_ms_leak_rate = 0;
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200379 return CMD_SUCCESS;
380}
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200381
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200382#define FC_BTIME_STR "Set target downlink maximum queueing time (only affects the advertised bucket size)\n"
Philipp Maier9459ebd2020-09-29 23:31:33 +0200383DEFUN_ATTR(cfg_pcu_fc_bucket_time,
384 cfg_pcu_fc_bucket_time_cmd,
385 "flow-control bucket-time <1-65534>",
386 FC_STR FC_BTIME_STR "Time in centi-seconds\n",
387 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200388{
Pau Espin Pedrole8912222021-01-14 14:03:17 +0100389 the_pcu->vty.fc_bucket_time = atoi(argv[0]);
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200390 return CMD_SUCCESS;
391}
392
Philipp Maier9459ebd2020-09-29 23:31:33 +0200393DEFUN_ATTR(cfg_pcu_no_fc_bucket_time,
394 cfg_pcu_no_fc_bucket_time_cmd,
395 "no flow-control bucket-time",
396 NO_STR FC_STR FC_BTIME_STR,
397 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200398{
Pau Espin Pedrole8912222021-01-14 14:03:17 +0100399 the_pcu->vty.fc_bucket_time = 0;
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200400 return CMD_SUCCESS;
401}
402
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200403#define CS_STR "Coding Scheme configuration\n"
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200404
Philipp Maier9459ebd2020-09-29 23:31:33 +0200405DEFUN_ATTR(cfg_pcu_cs,
406 cfg_pcu_cs_cmd,
407 "cs <1-4> [<1-4>]",
408 CS_STR
409 "Initial CS value to be used (overrides BTS config)\n"
410 "Use a different initial CS value for the uplink",
411 CMD_ATTR_IMMEDIATE)
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200412{
Pau Espin Pedrol793583e2021-01-14 16:20:57 +0100413 uint8_t cs_dl, cs_ul;
414 cs_dl = atoi(argv[0]);
Andreas Eversberg499ff412012-10-03 14:21:36 +0200415 if (argc > 1)
Pau Espin Pedrol793583e2021-01-14 16:20:57 +0100416 cs_ul = atoi(argv[1]);
Andreas Eversberg499ff412012-10-03 14:21:36 +0200417 else
Pau Espin Pedrol793583e2021-01-14 16:20:57 +0100418 cs_ul = cs_dl;
419 the_pcu->vty.force_initial_cs = true;
420 gprs_pcu_set_initial_cs(the_pcu, cs_dl, cs_ul);
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200421 return CMD_SUCCESS;
422}
423
Philipp Maier9459ebd2020-09-29 23:31:33 +0200424DEFUN_ATTR(cfg_pcu_no_cs,
425 cfg_pcu_no_cs_cmd,
426 "no cs",
427 NO_STR CS_STR,
428 CMD_ATTR_IMMEDIATE)
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200429{
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100430 the_pcu->vty.force_initial_cs = false;
Pau Espin Pedrol793583e2021-01-14 16:20:57 +0100431 gprs_pcu_set_initial_cs(the_pcu, 0, 0);
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200432 return CMD_SUCCESS;
433}
434
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100435#define CS_MAX_STR "Set maximum values for adaptive CS selection (overrides BTS config)\n"
Philipp Maier9459ebd2020-09-29 23:31:33 +0200436DEFUN_ATTR(cfg_pcu_cs_max,
437 cfg_pcu_cs_max_cmd,
438 "cs max <1-4> [<1-4>]",
439 CS_STR
440 CS_MAX_STR
441 "Maximum CS value to be used\n"
442 "Use a different maximum CS value for the uplink",
443 CMD_ATTR_IMMEDIATE)
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200444{
Pau Espin Pedrol343ec9b2020-10-30 18:35:54 +0100445 uint8_t cs_dl = atoi(argv[0]);
446 uint8_t cs_ul;
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200447
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200448 if (argc > 1)
Pau Espin Pedrol343ec9b2020-10-30 18:35:54 +0100449 cs_ul = atoi(argv[1]);
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200450 else
Pau Espin Pedrol343ec9b2020-10-30 18:35:54 +0100451 cs_ul = cs_dl;
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200452
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100453 gprs_pcu_set_max_cs(the_pcu, cs_dl, cs_ul);
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200454 return CMD_SUCCESS;
455}
456
Philipp Maier9459ebd2020-09-29 23:31:33 +0200457DEFUN_ATTR(cfg_pcu_no_cs_max,
458 cfg_pcu_no_cs_max_cmd,
459 "no cs max",
460 NO_STR CS_STR CS_MAX_STR,
461 CMD_ATTR_IMMEDIATE)
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200462{
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100463 gprs_pcu_set_max_cs(the_pcu, 0, 0);
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200464 return CMD_SUCCESS;
465}
466
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100467#define MCS_STR "Modulation and Coding Scheme configuration (EGPRS)\n"
Philipp Maier9459ebd2020-09-29 23:31:33 +0200468DEFUN_ATTR(cfg_pcu_mcs,
469 cfg_pcu_mcs_cmd,
470 "mcs <1-9> [<1-9>]",
471 MCS_STR
472 "Initial MCS value to be used (default 1)\n"
473 "Use a different initial MCS value for the uplink",
474 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +0100475{
Pau Espin Pedrol793583e2021-01-14 16:20:57 +0100476 uint8_t mcs_dl, mcs_ul;
477 mcs_dl = atoi(argv[0]);
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +0100478 if (argc > 1)
Pau Espin Pedrol793583e2021-01-14 16:20:57 +0100479 mcs_ul = atoi(argv[1]);
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +0100480 else
Pau Espin Pedrol793583e2021-01-14 16:20:57 +0100481 mcs_ul = mcs_dl;
482 the_pcu->vty.force_initial_mcs = true;
483 gprs_pcu_set_initial_mcs(the_pcu, mcs_dl, mcs_ul);
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +0100484 return CMD_SUCCESS;
485}
486
Philipp Maier9459ebd2020-09-29 23:31:33 +0200487DEFUN_ATTR(cfg_pcu_no_mcs,
488 cfg_pcu_no_mcs_cmd,
489 "no mcs",
490 NO_STR MCS_STR,
491 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +0100492{
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100493 the_pcu->vty.force_initial_mcs = false;
Pau Espin Pedrol793583e2021-01-14 16:20:57 +0100494 gprs_pcu_set_initial_mcs(the_pcu, 0, 0);
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +0100495 return CMD_SUCCESS;
496}
497
Philipp Maier9459ebd2020-09-29 23:31:33 +0200498DEFUN_ATTR(cfg_pcu_mcs_max,
499 cfg_pcu_mcs_max_cmd,
500 "mcs max <1-9> [<1-9>]",
501 MCS_STR
502 CS_MAX_STR
503 "Maximum MCS value to be used\n"
504 "Use a different maximum MCS value for the uplink",
505 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100506{
Pau Espin Pedrol343ec9b2020-10-30 18:35:54 +0100507 uint8_t mcs_dl = atoi(argv[0]);
508 uint8_t mcs_ul;
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100509
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100510 if (argc > 1)
Pau Espin Pedrol343ec9b2020-10-30 18:35:54 +0100511 mcs_ul = atoi(argv[1]);
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100512 else
Pau Espin Pedrol343ec9b2020-10-30 18:35:54 +0100513 mcs_ul = mcs_dl;
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100514
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100515 gprs_pcu_set_max_mcs(the_pcu, mcs_dl, mcs_ul);
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100516 return CMD_SUCCESS;
517}
518
Philipp Maier9459ebd2020-09-29 23:31:33 +0200519DEFUN_ATTR(cfg_pcu_no_mcs_max,
520 cfg_pcu_no_mcs_max_cmd,
521 "no mcs max",
522 NO_STR MCS_STR CS_MAX_STR,
523 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100524{
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100525 gprs_pcu_set_max_mcs(the_pcu, 0, 0);
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100526 return CMD_SUCCESS;
527}
528
Aravind Sirsikar50b09702016-08-22 17:21:10 +0530529#define DL_STR "downlink specific configuration\n"
530
Philipp Maier9459ebd2020-09-29 23:31:33 +0200531DEFUN_ATTR(cfg_pcu_dl_arq_type,
532 cfg_pcu_dl_arq_cmd,
533 "egprs dl arq-type (spb|arq2)",
534 EGPRS_STR DL_STR "ARQ options\n"
535 "enable SPB(ARQ1) support\n"
536 "enable ARQ2 support",
537 CMD_ATTR_IMMEDIATE)
Aravind Sirsikar50b09702016-08-22 17:21:10 +0530538{
Aravind Sirsikar50b09702016-08-22 17:21:10 +0530539 if (!strcmp(argv[0], "arq2"))
Pau Espin Pedrol97296b22021-01-14 13:08:02 +0100540 the_pcu->vty.dl_arq_type = EGPRS_ARQ2;
Aravind Sirsikar50b09702016-08-22 17:21:10 +0530541 else
Pau Espin Pedrol97296b22021-01-14 13:08:02 +0100542 the_pcu->vty.dl_arq_type = EGPRS_ARQ1;
Aravind Sirsikar50b09702016-08-22 17:21:10 +0530543
544 return CMD_SUCCESS;
545}
546
Philipp Maier9459ebd2020-09-29 23:31:33 +0200547DEFUN_USRATTR(cfg_pcu_window_size,
548 cfg_pcu_window_size_cmd,
549 X(PCU_VTY_ATTR_NEW_TBF),
550 "window-size <0-1024> [<0-256>]",
551 "Window size configuration (b + N_PDCH * f)\n"
552 "Base value (b)\n"
553 "Factor for number of PDCH (f)")
Jacob Erlbeck36df7742016-01-19 15:53:30 +0100554{
Jacob Erlbeck36df7742016-01-19 15:53:30 +0100555 uint16_t b = atoi(argv[0]);
556
Pau Espin Pedrol519d0712021-01-14 14:30:03 +0100557 the_pcu->vty.ws_base = b;
Jacob Erlbeck36df7742016-01-19 15:53:30 +0100558 if (argc > 1) {
559 uint16_t f = atoi(argv[1]);
Pau Espin Pedrol519d0712021-01-14 14:30:03 +0100560 the_pcu->vty.ws_pdch = f;
Jacob Erlbeck36df7742016-01-19 15:53:30 +0100561 }
562
563 return CMD_SUCCESS;
564}
565
566
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200567#define QUEUE_STR "Packet queue options\n"
568#define LIFETIME_STR "Set lifetime limit of LLC frame in centi-seconds " \
569 "(overrides the value given by SGSN)\n"
570
Philipp Maier9459ebd2020-09-29 23:31:33 +0200571DEFUN_USRATTR(cfg_pcu_queue_lifetime,
572 cfg_pcu_queue_lifetime_cmd,
573 X(PCU_VTY_ATTR_NEW_TBF),
574 "queue lifetime <1-65534>",
575 QUEUE_STR LIFETIME_STR "Lifetime in centi-seconds")
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200576{
Jacob Erlbeck2acfbeb2015-04-30 17:55:16 +0200577 uint16_t csec = atoi(argv[0]);
Pau Espin Pedrolf473ec92021-01-14 14:45:14 +0100578 the_pcu->vty.force_llc_lifetime = csec;
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200579 return CMD_SUCCESS;
580}
581
Philipp Maier9459ebd2020-09-29 23:31:33 +0200582DEFUN_USRATTR(cfg_pcu_queue_lifetime_inf,
583 cfg_pcu_queue_lifetime_inf_cmd,
584 X(PCU_VTY_ATTR_NEW_TBF),
585 "queue lifetime infinite",
586 QUEUE_STR LIFETIME_STR "Infinite lifetime")
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200587{
Pau Espin Pedrolf473ec92021-01-14 14:45:14 +0100588 the_pcu->vty.force_llc_lifetime = 0xffff;
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200589 return CMD_SUCCESS;
590}
591
Philipp Maier9459ebd2020-09-29 23:31:33 +0200592DEFUN_USRATTR(cfg_pcu_no_queue_lifetime,
593 cfg_pcu_no_queue_lifetime_cmd,
594 X(PCU_VTY_ATTR_NEW_TBF),
595 "no queue lifetime",
596 NO_STR QUEUE_STR "Disable lifetime limit of LLC frame (use value given "
597 "by SGSN)\n")
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200598{
Pau Espin Pedrolf473ec92021-01-14 14:45:14 +0100599 the_pcu->vty.force_llc_lifetime = 0;
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200600 return CMD_SUCCESS;
601}
602
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100603#define QUEUE_HYSTERESIS_STR "Set lifetime hysteresis of LLC frame in centi-seconds " \
604 "(continue discarding until lifetime-hysteresis is reached)\n"
605
Philipp Maier9459ebd2020-09-29 23:31:33 +0200606DEFUN_USRATTR(cfg_pcu_queue_hysteresis,
607 cfg_pcu_queue_hysteresis_cmd,
608 X(PCU_VTY_ATTR_NEW_TBF),
609 "queue hysteresis <1-65535>",
610 QUEUE_STR QUEUE_HYSTERESIS_STR "Hysteresis in centi-seconds")
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100611{
Jacob Erlbeck2acfbeb2015-04-30 17:55:16 +0200612 uint16_t csec = atoi(argv[0]);
Pau Espin Pedrolf473ec92021-01-14 14:45:14 +0100613 the_pcu->vty.llc_discard_csec = csec;
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100614 return CMD_SUCCESS;
615}
616
Philipp Maier9459ebd2020-09-29 23:31:33 +0200617DEFUN_USRATTR(cfg_pcu_no_queue_hysteresis,
618 cfg_pcu_no_queue_hysteresis_cmd,
619 X(PCU_VTY_ATTR_NEW_TBF),
620 "no queue hysteresis",
621 NO_STR QUEUE_STR QUEUE_HYSTERESIS_STR)
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100622{
Pau Espin Pedrolf473ec92021-01-14 14:45:14 +0100623 the_pcu->vty.llc_discard_csec = 0;
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100624 return CMD_SUCCESS;
625}
626
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200627#define QUEUE_CODEL_STR "Set CoDel queue management\n"
Philipp Maier9459ebd2020-09-29 23:31:33 +0200628DEFUN_USRATTR(cfg_pcu_queue_codel,
629 cfg_pcu_queue_codel_cmd,
630 X(PCU_VTY_ATTR_NEW_SUBSCR),
631 "queue codel",
632 QUEUE_STR QUEUE_CODEL_STR)
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200633{
Pau Espin Pedrolf473ec92021-01-14 14:45:14 +0100634 the_pcu->vty.llc_codel_interval_msec = LLC_CODEL_USE_DEFAULT;
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200635 return CMD_SUCCESS;
636}
637
Philipp Maier9459ebd2020-09-29 23:31:33 +0200638DEFUN_USRATTR(cfg_pcu_queue_codel_interval,
639 cfg_pcu_queue_codel_interval_cmd,
640 X(PCU_VTY_ATTR_NEW_SUBSCR),
641 "queue codel interval <1-1000>",
642 QUEUE_STR QUEUE_CODEL_STR "Specify interval\n" "Interval in centi-seconds")
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200643{
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200644 uint16_t csec = atoi(argv[0]);
Pau Espin Pedrolf473ec92021-01-14 14:45:14 +0100645 the_pcu->vty.llc_codel_interval_msec = 10*csec;
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200646 return CMD_SUCCESS;
647}
648
Philipp Maier9459ebd2020-09-29 23:31:33 +0200649DEFUN_USRATTR(cfg_pcu_no_queue_codel,
650 cfg_pcu_no_queue_codel_cmd,
651 X(PCU_VTY_ATTR_NEW_SUBSCR),
652 "no queue codel",
653 NO_STR QUEUE_STR QUEUE_CODEL_STR)
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200654{
Pau Espin Pedrolf473ec92021-01-14 14:45:14 +0100655 the_pcu->vty.llc_codel_interval_msec = LLC_CODEL_DISABLE;
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200656 return CMD_SUCCESS;
657}
658
659
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200660#define QUEUE_IDLE_ACK_STR "Request an ACK after the last DL LLC frame in centi-seconds\n"
661
Philipp Maier9459ebd2020-09-29 23:31:33 +0200662DEFUN_ATTR(cfg_pcu_queue_idle_ack_delay,
663 cfg_pcu_queue_idle_ack_delay_cmd,
664 "queue idle-ack-delay <1-65535>",
665 QUEUE_STR QUEUE_IDLE_ACK_STR "Idle ACK delay in centi-seconds",
666 CMD_ATTR_IMMEDIATE)
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200667{
Jacob Erlbeck2acfbeb2015-04-30 17:55:16 +0200668 uint16_t csec = atoi(argv[0]);
Pau Espin Pedrolf473ec92021-01-14 14:45:14 +0100669 the_pcu->vty.llc_idle_ack_csec = csec;
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200670 return CMD_SUCCESS;
671}
672
Philipp Maier9459ebd2020-09-29 23:31:33 +0200673DEFUN_ATTR(cfg_pcu_no_queue_idle_ack_delay,
674 cfg_pcu_no_queue_idle_ack_delay_cmd,
675 "no queue idle-ack-delay",
676 NO_STR QUEUE_STR QUEUE_IDLE_ACK_STR,
677 CMD_ATTR_IMMEDIATE)
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200678{
Pau Espin Pedrolf473ec92021-01-14 14:45:14 +0100679 the_pcu->vty.llc_idle_ack_csec = 0;
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200680 return CMD_SUCCESS;
681}
682
Philipp Maier9459ebd2020-09-29 23:31:33 +0200683DEFUN_ATTR(cfg_pcu_alloc,
684 cfg_pcu_alloc_cmd,
685 "alloc-algorithm (a|b|dynamic)",
686 "Select slot allocation algorithm to use when assigning timeslots on "
687 "PACCH\n"
688 "Single slot is assigned only\n"
689 "Multiple slots are assigned for semi-duplex operation\n"
690 "Dynamically select the algorithm based on the system state\n",
691 CMD_ATTR_IMMEDIATE)
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200692{
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200693 switch (argv[0][0]) {
694 case 'a':
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100695 the_pcu->alloc_algorithm = alloc_algorithm_a;
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200696 break;
697 case 'b':
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100698 the_pcu->alloc_algorithm = alloc_algorithm_b;
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200699 break;
Jacob Erlbeck400ec022015-07-14 13:31:48 +0200700 default:
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100701 the_pcu->alloc_algorithm = alloc_algorithm_dynamic;
Jacob Erlbeck400ec022015-07-14 13:31:48 +0200702 break;
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200703 }
704
705 return CMD_SUCCESS;
706}
707
Philipp Maier9459ebd2020-09-29 23:31:33 +0200708DEFUN_ATTR(cfg_pcu_two_phase,
709 cfg_pcu_two_phase_cmd,
710 "two-phase-access",
711 "Force two phase access when MS requests single phase access\n",
712 CMD_ATTR_IMMEDIATE)
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200713{
Pau Espin Pedrol03de8982021-01-14 12:48:50 +0100714 the_pcu->vty.force_two_phase = 1;
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200715 return CMD_SUCCESS;
716}
717
Philipp Maier9459ebd2020-09-29 23:31:33 +0200718DEFUN_ATTR(cfg_pcu_no_two_phase,
719 cfg_pcu_no_two_phase_cmd,
720 "no two-phase-access",
721 NO_STR "Only use two phase access when requested my MS\n",
722 CMD_ATTR_IMMEDIATE)
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200723{
Pau Espin Pedrol03de8982021-01-14 12:48:50 +0100724 the_pcu->vty.force_two_phase = 0;
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200725 return CMD_SUCCESS;
726}
727
Philipp Maier9459ebd2020-09-29 23:31:33 +0200728DEFUN_ATTR(cfg_pcu_alpha,
729 cfg_pcu_alpha_cmd,
730 "alpha <0-10>",
731 "Alpha parameter for MS power control in units of 0.1 (see TS 05.08) "
732 "NOTE: Be sure to set Alpha value at System information 13 too.\n"
733 "Alpha in units of 0.1\n",
734 CMD_ATTR_IMMEDIATE)
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200735{
Pau Espin Pedrola2814952021-01-14 12:53:53 +0100736 the_pcu->vty.alpha = atoi(argv[0]);
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200737 return CMD_SUCCESS;
738}
739
Philipp Maier9459ebd2020-09-29 23:31:33 +0200740DEFUN_ATTR(cfg_pcu_gamma,
741 cfg_pcu_gamma_cmd,
742 "gamma <0-62>",
743 "Gamma parameter for MS power control in units of dB (see TS 05.08)\n"
744 "Gamma in even unit of dBs\n",
745 CMD_ATTR_IMMEDIATE)
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200746{
Pau Espin Pedrola2814952021-01-14 12:53:53 +0100747 the_pcu->vty.gamma = atoi(argv[0]) / 2;
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200748 return CMD_SUCCESS;
749}
750
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +0100751DEFUN(show_bts_stats,
752 show_bts_stats_cmd,
753 "show bts statistics",
754 SHOW_STR "BTS related functionality\nStatistics\n")
755{
756 vty_out_rate_ctr_group(vty, "", bts_main_data_stats());
757 return CMD_SUCCESS;
Daniel Willmann772415f2014-01-15 17:06:51 +0100758}
759
Pau Espin Pedrola1ac2f02020-09-22 17:01:31 +0200760DEFUN(show_bts_pdch,
761 show_bts_pdch_cmd,
762 "show bts pdch",
763 SHOW_STR "BTS related functionality\nPDCH timeslots\n")
764{
765 return pcu_vty_show_bts_pdch(vty, bts_main_data());
766}
767
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100768#define IDLE_TIME_STR "keep an idle DL TBF alive for the time given\n"
Pau Espin Pedrol2b5c6292019-09-09 13:41:00 +0200769DEFUN_DEPRECATED(cfg_pcu_dl_tbf_idle_time,
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100770 cfg_pcu_dl_tbf_idle_time_cmd,
771 "dl-tbf-idle-time <1-5000>",
772 IDLE_TIME_STR "idle time in msec")
773{
Pau Espin Pedrol2b5c6292019-09-09 13:41:00 +0200774 vty_out(vty, "%% 'dl-tbf-idle-time' is now deprecated: use 'timer X2031 <val>' instead%s", VTY_NEWLINE);
775
Pau Espin Pedrol924aaad2021-01-14 12:01:42 +0100776 if (osmo_tdef_set(the_pcu->T_defs, -2031, atoi(argv[0]), OSMO_TDEF_MS) < 0)
Pau Espin Pedrol2b5c6292019-09-09 13:41:00 +0200777 return CMD_WARNING;
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100778 return CMD_SUCCESS;
779}
780
Pau Espin Pedrol2b5c6292019-09-09 13:41:00 +0200781DEFUN_DEPRECATED(cfg_pcu_no_dl_tbf_idle_time,
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100782 cfg_pcu_no_dl_tbf_idle_time_cmd,
783 "no dl-tbf-idle-time",
784 NO_STR IDLE_TIME_STR)
785{
Pau Espin Pedrol2b5c6292019-09-09 13:41:00 +0200786 vty_out(vty, "%% 'no dl-tbf-idle-time' is now deprecated: use 'timer X2031 0' instead%s", VTY_NEWLINE);
787
Pau Espin Pedrol924aaad2021-01-14 12:01:42 +0100788 if (osmo_tdef_set(the_pcu->T_defs, -2031, 0, OSMO_TDEF_MS) < 0)
Pau Espin Pedrol2b5c6292019-09-09 13:41:00 +0200789 return CMD_WARNING;
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100790 return CMD_SUCCESS;
791}
792
Oliver Smith45fdc442019-09-05 15:12:20 +0200793#define RETRANSMISSION_STR "retransmit blocks even before the MS had a chance to receive them (better throughput," \
794 " less readable traces)"
Philipp Maier9459ebd2020-09-29 23:31:33 +0200795DEFUN_ATTR(cfg_pcu_dl_tbf_preemptive_retransmission,
796 cfg_pcu_dl_tbf_preemptive_retransmission_cmd,
797 "dl-tbf-preemptive-retransmission",
798 RETRANSMISSION_STR " (enabled by default)",
799 CMD_ATTR_IMMEDIATE)
Oliver Smith45fdc442019-09-05 15:12:20 +0200800{
Pau Espin Pedrol05f9f592021-01-14 12:56:58 +0100801 the_pcu->vty.dl_tbf_preemptive_retransmission = true;
Oliver Smith45fdc442019-09-05 15:12:20 +0200802 return CMD_SUCCESS;
803}
804
Philipp Maier9459ebd2020-09-29 23:31:33 +0200805DEFUN_ATTR(cfg_pcu_no_dl_tbf_preemptive_retransmission,
806 cfg_pcu_no_dl_tbf_preemptive_retransmission_cmd,
807 "no dl-tbf-preemptive-retransmission",
808 NO_STR RETRANSMISSION_STR,
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 = false;
Oliver Smith45fdc442019-09-05 15:12:20 +0200812 return CMD_SUCCESS;
813}
814
Jacob Erlbecka098c192015-05-28 16:11:19 +0200815#define MS_IDLE_TIME_STR "keep an idle MS object alive for the time given\n"
Pau Espin Pedrol63700ea2019-09-09 13:19:06 +0200816DEFUN_DEPRECATED(cfg_pcu_ms_idle_time,
Jacob Erlbecka098c192015-05-28 16:11:19 +0200817 cfg_pcu_ms_idle_time_cmd,
818 "ms-idle-time <1-7200>",
819 MS_IDLE_TIME_STR "idle time in sec")
820{
Pau Espin Pedrol63700ea2019-09-09 13:19:06 +0200821 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 +0100822 if (osmo_tdef_set(the_pcu->T_defs, -2030, atoi(argv[0]), OSMO_TDEF_S) < 0)
Pau Espin Pedrol63700ea2019-09-09 13:19:06 +0200823 return CMD_WARNING;
Jacob Erlbecka098c192015-05-28 16:11:19 +0200824 return CMD_SUCCESS;
825}
826
Pau Espin Pedrol63700ea2019-09-09 13:19:06 +0200827DEFUN_DEPRECATED(cfg_pcu_no_ms_idle_time,
Jacob Erlbecka098c192015-05-28 16:11:19 +0200828 cfg_pcu_no_ms_idle_time_cmd,
829 "no ms-idle-time",
830 NO_STR MS_IDLE_TIME_STR)
831{
Pau Espin Pedrol63700ea2019-09-09 13:19:06 +0200832 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 +0100833 if (osmo_tdef_set(the_pcu->T_defs, -2030, 0, OSMO_TDEF_S) < 0)
Pau Espin Pedrol63700ea2019-09-09 13:19:06 +0200834 return CMD_WARNING;
Jacob Erlbecka098c192015-05-28 16:11:19 +0200835 return CMD_SUCCESS;
836}
837
Pau Espin Pedrol1e6eb302019-11-28 17:00:44 +0100838#define CS_ERR_LIMITS_STR "set thresholds for error rate based downlink (M)CS adjustment\n"
Philipp Maier9459ebd2020-09-29 23:31:33 +0200839DEFUN_ATTR(cfg_pcu_cs_err_limits,
840 cfg_pcu_cs_err_limits_cmd,
841 "cs threshold <0-100> <0-100>",
842 CS_STR CS_ERR_LIMITS_STR "lower limit in %\n" "upper limit in %\n",
843 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200844{
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200845 uint8_t lower_limit = atoi(argv[0]);
846 uint8_t upper_limit = atoi(argv[1]);
847
848 if (lower_limit > upper_limit) {
849 vty_out(vty,
850 "The lower limit must be less than or equal to the "
851 "upper limit.%s", VTY_NEWLINE);
852 return CMD_WARNING;
853 }
854
Pau Espin Pedrole8dcf642021-01-14 13:17:01 +0100855 the_pcu->vty.cs_adj_enabled = true;
856 the_pcu->vty.cs_adj_upper_limit = upper_limit;
857 the_pcu->vty.cs_adj_lower_limit = lower_limit;
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200858
859 return CMD_SUCCESS;
860}
861
Philipp Maier9459ebd2020-09-29 23:31:33 +0200862DEFUN_ATTR(cfg_pcu_no_cs_err_limits,
863 cfg_pcu_no_cs_err_limits_cmd,
864 "no cs threshold",
865 NO_STR CS_STR CS_ERR_LIMITS_STR,
866 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200867{
Pau Espin Pedrole8dcf642021-01-14 13:17:01 +0100868 the_pcu->vty.cs_adj_enabled = false;
869 the_pcu->vty.cs_adj_upper_limit = 100;
870 the_pcu->vty.cs_adj_lower_limit = 0;
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200871
872 return CMD_SUCCESS;
873}
874
Pau Espin Pedrol1e6eb302019-11-28 17:00:44 +0100875#define CS_DOWNGRADE_STR "set threshold for data size based downlink (M)CS downgrade\n"
Philipp Maier9459ebd2020-09-29 23:31:33 +0200876DEFUN_ATTR(cfg_pcu_cs_downgrade_thrsh,
877 cfg_pcu_cs_downgrade_thrsh_cmd,
878 "cs downgrade-threshold <1-10000>",
879 CS_STR CS_DOWNGRADE_STR "downgrade if less octets left\n",
880 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +0200881{
Pau Espin Pedrolad79b852021-01-14 13:20:55 +0100882 the_pcu->vty.cs_downgrade_threshold = atoi(argv[0]);
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +0200883 return CMD_SUCCESS;
884}
885
Philipp Maier9459ebd2020-09-29 23:31:33 +0200886DEFUN_ATTR(cfg_pcu_no_cs_downgrade_thrsh,
887 cfg_pcu_no_cs_downgrade_thrsh_cmd,
888 "no cs downgrade-threshold",
889 NO_STR CS_STR CS_DOWNGRADE_STR,
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 = 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_cs_lqual_ranges,
897 cfg_pcu_cs_lqual_ranges_cmd,
898 "cs link-quality-ranges cs1 <0-35> cs2 <0-35> <0-35> cs3 <0-35> <0-35> cs4 <0-35>",
899 CS_STR "Set link quality ranges for each uplink CS\n"
900 "Set quality range for CS-1 (high value only)\n"
901 "CS-1 high (dB)\n"
902 "Set quality range for CS-2\n"
903 "CS-2 low (dB)\n"
904 "CS-2 high (dB)\n"
905 "Set quality range for CS-3\n"
906 "CS-3 low (dB)\n"
907 "CS-3 high (dB)\n"
908 "Set quality range for CS-4 (low value only)\n"
909 "CS-4 low (dB)\n",
910 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck94cde132015-06-09 09:44:36 +0200911{
Jacob Erlbeck94cde132015-06-09 09:44:36 +0200912 uint8_t cs1_high = atoi(argv[0]);
913 uint8_t cs2_low = atoi(argv[1]);
914 uint8_t cs2_high = atoi(argv[2]);
915 uint8_t cs3_low = atoi(argv[3]);
916 uint8_t cs3_high = atoi(argv[4]);
917 uint8_t cs4_low = atoi(argv[5]);
918
Pau Espin Pedrol54b159a2021-01-14 13:30:04 +0100919 the_pcu->vty.cs_lqual_ranges[0].high = cs1_high;
920 the_pcu->vty.cs_lqual_ranges[1].low = cs2_low;
921 the_pcu->vty.cs_lqual_ranges[1].high = cs2_high;
922 the_pcu->vty.cs_lqual_ranges[2].low = cs3_low;
923 the_pcu->vty.cs_lqual_ranges[2].high = cs3_high;
924 the_pcu->vty.cs_lqual_ranges[3].low = cs4_low;
Jacob Erlbeck94cde132015-06-09 09:44:36 +0200925
926 return CMD_SUCCESS;
927}
928
Philipp Maier9459ebd2020-09-29 23:31:33 +0200929DEFUN_ATTR(cfg_pcu_mcs_lqual_ranges,
930 cfg_pcu_mcs_lqual_ranges_cmd,
931 "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>",
932 CS_STR "Set link quality ranges for each uplink MCS\n"
933 "Set quality range for MCS-1 (high value only)\n"
934 "MCS-1 high (dB)\n"
935 "Set quality range for MCS-2\n"
936 "MCS-2 high (dB)\n"
937 "MCS-2 low (dB)\n"
938 "Set quality range for MCS-3\n"
939 "MCS-3 high (dB)\n"
940 "MCS-3 low (dB)\n"
941 "Set quality range for MCS-4\n"
942 "MCS-4 high (dB)\n"
943 "MCS-4 low (dB)\n"
944 "Set quality range for MCS-5\n"
945 "MCS-5 high (dB)\n"
946 "MCS-5 low (dB)\n"
947 "Set quality range for MCS-6\n"
948 "MCS-6 low (dB)\n"
949 "MCS-6 high (dB)\n"
950 "Set quality range for MCS-7\n"
951 "MCS-7 low (dB)\n"
952 "MCS-7 high (dB)\n"
953 "Set quality range for MCS-8\n"
954 "MCS-8 low (dB)\n"
955 "MCS-8 high (dB)\n"
956 "Set quality range for MCS-9 (low value only)\n"
957 "MCS-9 low (dB)\n",
958 CMD_ATTR_IMMEDIATE)
Minh-Quang Nguyen1f189092017-08-16 09:50:06 -0400959{
Pau Espin Pedrol54b159a2021-01-14 13:30:04 +0100960 the_pcu->vty.mcs_lqual_ranges[0].high = atoi(argv[0]);
961 the_pcu->vty.mcs_lqual_ranges[1].low = atoi(argv[1]);
962 the_pcu->vty.mcs_lqual_ranges[1].high = atoi(argv[2]);
963 the_pcu->vty.mcs_lqual_ranges[2].low = atoi(argv[3]);
964 the_pcu->vty.mcs_lqual_ranges[2].high = atoi(argv[4]);
965 the_pcu->vty.mcs_lqual_ranges[3].low = atoi(argv[5]);
966 the_pcu->vty.mcs_lqual_ranges[3].high = atoi(argv[6]);
967 the_pcu->vty.mcs_lqual_ranges[4].low = atoi(argv[7]);
968 the_pcu->vty.mcs_lqual_ranges[4].high = atoi(argv[8]);
969 the_pcu->vty.mcs_lqual_ranges[5].low = atoi(argv[9]);
970 the_pcu->vty.mcs_lqual_ranges[5].high = atoi(argv[10]);
971 the_pcu->vty.mcs_lqual_ranges[6].low = atoi(argv[11]);
972 the_pcu->vty.mcs_lqual_ranges[6].high = atoi(argv[12]);
973 the_pcu->vty.mcs_lqual_ranges[7].low = atoi(argv[13]);
974 the_pcu->vty.mcs_lqual_ranges[7].high = atoi(argv[14]);
975 the_pcu->vty.mcs_lqual_ranges[8].low = atoi(argv[15]);
Minh-Quang Nguyen1f189092017-08-16 09:50:06 -0400976
977 return CMD_SUCCESS;
978}
979
Pau Espin Pedrolc4178e52017-08-08 15:03:50 +0200980DEFUN(cfg_pcu_sock,
981 cfg_pcu_sock_cmd,
982 "pcu-socket PATH",
983 "Configure the osmo-bts PCU socket file/path name\n"
984 "Path of the socket to connect to\n")
985{
Vadim Yanitskiyfc75cc02019-11-30 20:13:25 +0700986 if (vty->type != VTY_FILE)
987 vty_out(vty, "Changing PCU socket path at run-time has no effect%s", VTY_NEWLINE);
988
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100989 osmo_talloc_replace_string(tall_pcu_ctx, &the_pcu->pcu_sock_path, argv[0]);
Pau Espin Pedrolc4178e52017-08-08 15:03:50 +0200990
991 return CMD_SUCCESS;
992}
Jacob Erlbeck94cde132015-06-09 09:44:36 +0200993
Philipp Maier9459ebd2020-09-29 23:31:33 +0200994DEFUN_USRATTR(cfg_pcu_gb_dialect,
995 cfg_pcu_gb_dialect_cmd,
996 X(PCU_VTY_ATTR_NS_RESET),
997 "gb-dialect (classic|ip-sns)",
998 "Select which Gb interface dialect to use\n"
999 "Classic Gb interface with NS-{RESET,BLOCK,UNBLOCK} and static configuration\n"
1000 "Modern Gb interface with IP-SNS (Sub Network Service) and dynamic configuration\n")
Harald Welte57d35152018-07-05 03:11:17 +02001001{
Alexander Couzens290d9032020-09-16 21:52:02 +02001002 if (!strcmp(argv[0], "ip-sns")) {
Pau Espin Pedrol113fb412021-01-14 13:36:02 +01001003 the_pcu->vty.ns_dialect = NS2_DIALECT_SNS;
Alexander Couzens290d9032020-09-16 21:52:02 +02001004 } else {
Pau Espin Pedrol113fb412021-01-14 13:36:02 +01001005 the_pcu->vty.ns_dialect = NS2_DIALECT_IPACCESS;
Alexander Couzens290d9032020-09-16 21:52:02 +02001006 }
Harald Welte57d35152018-07-05 03:11:17 +02001007
1008 return CMD_SUCCESS;
1009}
1010
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +02001011DEFUN(show_bts_timer, show_bts_timer_cmd,
1012 "show bts-timer " OSMO_TDEF_VTY_ARG_T_OPTIONAL,
1013 SHOW_STR "Show BTS controlled timers\n"
1014 OSMO_TDEF_VTY_DOC_T)
1015{
1016 struct gprs_rlcmac_bts *bts = bts_main_data();
1017 const char *T_arg = argc > 0 ? argv[0] : NULL;
1018 return osmo_tdef_vty_show_cmd(vty, bts->T_defs_bts, T_arg, NULL);
1019}
1020
1021DEFUN(show_timer, show_timer_cmd,
1022 "show timer " OSMO_TDEF_VTY_ARG_T_OPTIONAL,
1023 SHOW_STR "Show PCU timers\n"
1024 OSMO_TDEF_VTY_DOC_T)
1025{
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +02001026 const char *T_arg = argc > 0 ? argv[0] : NULL;
Pau Espin Pedrol924aaad2021-01-14 12:01:42 +01001027 return osmo_tdef_vty_show_cmd(vty, the_pcu->T_defs, T_arg, NULL);
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +02001028}
1029
Philipp Maier9459ebd2020-09-29 23:31:33 +02001030DEFUN_ATTR(cfg_pcu_timer, cfg_pcu_timer_cmd,
1031 "timer " OSMO_TDEF_VTY_ARG_SET_OPTIONAL,
1032 "Configure or show PCU timers\n"
1033 OSMO_TDEF_VTY_DOC_SET,
1034 CMD_ATTR_IMMEDIATE)
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +02001035{
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +02001036 /* If any arguments are missing, redirect to 'show' */
1037 if (argc < 2)
1038 return show_timer(self, vty, argc, argv);
Pau Espin Pedrol924aaad2021-01-14 12:01:42 +01001039 return osmo_tdef_vty_set_cmd(vty, the_pcu->T_defs, argv);
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +02001040}
1041
Daniel Willmann772415f2014-01-15 17:06:51 +01001042DEFUN(show_tbf,
1043 show_tbf_cmd,
Max12a09872018-02-01 16:07:33 +01001044 "show tbf (all|ccch|pacch)",
1045 SHOW_STR "information about TBFs\n"
1046 "All TBFs\n"
1047 "TBFs allocated via CCCH\n"
1048 "TBFs allocated via PACCH\n")
Daniel Willmann772415f2014-01-15 17:06:51 +01001049{
1050 struct gprs_rlcmac_bts *bts = bts_main_data();
Vadim Yanitskiycef2f842019-10-09 21:52:50 +07001051 uint32_t flags = UINT32_MAX;
Max12a09872018-02-01 16:07:33 +01001052
Vadim Yanitskiycef2f842019-10-09 21:52:50 +07001053 if (argv[0][0] == 'c')
1054 flags = (1 << GPRS_RLCMAC_FLAG_CCCH);
1055 else if (argv[0][0] == 'p')
1056 flags = (1 << GPRS_RLCMAC_FLAG_PACCH);
Max12a09872018-02-01 16:07:33 +01001057
Vadim Yanitskiycef2f842019-10-09 21:52:50 +07001058 return pcu_vty_show_tbf_all(vty, bts, flags);
Daniel Willmann772415f2014-01-15 17:06:51 +01001059}
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +01001060
Jacob Erlbeckf47f68a2015-06-04 10:23:24 +02001061DEFUN(show_ms_all,
1062 show_ms_all_cmd,
1063 "show ms all",
1064 SHOW_STR "information about MSs\n" "All TBFs\n")
1065{
1066 struct gprs_rlcmac_bts *bts = bts_main_data();
1067 return pcu_vty_show_ms_all(vty, bts);
1068}
1069
Jacob Erlbeck37e896d2015-06-05 16:33:33 +02001070DEFUN(show_ms_tlli,
1071 show_ms_tlli_cmd,
1072 "show ms tlli TLLI",
1073 SHOW_STR "information about MSs\n" "Select MS by TLLI\n" "TLLI as hex\n")
1074{
1075 struct gprs_rlcmac_bts *bts = bts_main_data();
1076 char *endp = NULL;
1077 unsigned long long tlli = strtoll(argv[0], &endp, 16);
1078 if ((endp != NULL && *endp != 0) || tlli > 0xffffffffULL) {
1079 vty_out(vty, "Invalid TLLI.%s", VTY_NEWLINE);
1080 return CMD_WARNING;
1081 }
1082 return pcu_vty_show_ms_by_tlli(vty, bts, (uint32_t)tlli);
1083}
1084
1085DEFUN(show_ms_imsi,
1086 show_ms_imsi_cmd,
1087 "show ms imsi IMSI",
1088 SHOW_STR "information about MSs\n" "Select MS by IMSI\n" "IMSI\n")
1089{
1090 struct gprs_rlcmac_bts *bts = bts_main_data();
1091 return pcu_vty_show_ms_by_imsi(vty, bts, argv[0]);
1092}
1093
Andreas Eversberg12942562012-07-12 14:31:57 +02001094static const char pcu_copyright[] =
Harald Welted1e340f2013-01-17 12:24:29 +01001095 "Copyright (C) 2012 by Ivan Kluchnikov <kluchnikovi@gmail.com> and \r\n"
1096 " Andreas Eversberg <jolly@eversberg.eu>\r\n"
Andreas Eversberg12942562012-07-12 14:31:57 +02001097 "License GNU GPL version 2 or later\r\n"
1098 "This is free software: you are free to change and redistribute it.\r\n"
1099 "There is NO WARRANTY, to the extent permitted by law.\r\n";
1100
1101struct vty_app_info pcu_vty_info = {
Pau Espin Pedrold0fc9e82019-11-29 13:37:45 +01001102 .name = "OsmoPCU",
Andreas Eversberg12942562012-07-12 14:31:57 +02001103 .version = PACKAGE_VERSION,
1104 .copyright = pcu_copyright,
Philipp Maier9459ebd2020-09-29 23:31:33 +02001105 .usr_attr_desc = {
1106 [PCU_VTY_ATTR_NEW_TBF] = \
1107 "This command applies when a new TBF is begins",
1108 [PCU_VTY_ATTR_NEW_SUBSCR] = \
1109 "This command applies when a new subscriber attaches",
1110 [PCU_VTY_ATTR_NS_RESET] = \
1111 "This command applies when the NS is reset",
1112 },
1113 .usr_attr_letters = {
1114 [PCU_VTY_ATTR_NEW_TBF] = 'n',
1115 [PCU_VTY_ATTR_NEW_SUBSCR] = 's',
1116 [PCU_VTY_ATTR_NS_RESET] = 'r',
1117 },
Andreas Eversberg12942562012-07-12 14:31:57 +02001118};
1119
Pau Espin Pedrolcd2ac562019-08-05 14:30:44 +02001120int pcu_vty_init(void)
Andreas Eversberg12942562012-07-12 14:31:57 +02001121{
1122// install_element_ve(&show_pcu_cmd);
1123
Harald Welte717cdf52017-07-21 21:56:23 +02001124 cfg_pcu_gsmtap_categ_cmd.string = vty_cmd_string_from_valstr(tall_pcu_ctx, pcu_gsmtap_categ_names,
1125 "gsmtap-category (",
1126 "|",")", VTY_DO_LOWER);
1127 cfg_pcu_gsmtap_categ_cmd.doc = vty_cmd_string_from_valstr(tall_pcu_ctx, pcu_gsmtap_categ_help,
1128 "GSMTAP Category\n",
1129 "\n", "", 0);
1130 cfg_pcu_no_gsmtap_categ_cmd.string = vty_cmd_string_from_valstr(tall_pcu_ctx, pcu_gsmtap_categ_names,
1131 "no gsmtap-category (",
1132 "|",")", VTY_DO_LOWER);
1133 cfg_pcu_no_gsmtap_categ_cmd.doc = vty_cmd_string_from_valstr(tall_pcu_ctx, pcu_gsmtap_categ_help,
1134 NO_STR "GSMTAP Category\n",
1135 "\n", "", 0);
1136
Pau Espin Pedrolcd2ac562019-08-05 14:30:44 +02001137 logging_vty_add_cmds();
1138 osmo_stats_vty_add_cmds();
Vadim Yanitskiyd83c8ff2020-02-06 16:46:17 +07001139 osmo_talloc_vty_add_cmds();
Andreas Eversberg12942562012-07-12 14:31:57 +02001140
Andreas Eversberg8b761a32012-07-20 21:50:31 +02001141 install_node(&pcu_node, config_write_pcu);
1142 install_element(CONFIG_NODE, &cfg_pcu_cmd);
Jacob Erlbeck953c7892015-09-28 18:12:57 +02001143 install_element(PCU_NODE, &cfg_pcu_egprs_cmd);
1144 install_element(PCU_NODE, &cfg_pcu_no_egprs_cmd);
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +02001145 install_element(PCU_NODE, &cfg_pcu_no_two_phase_cmd);
Andreas Eversberg8b761a32012-07-20 21:50:31 +02001146 install_element(PCU_NODE, &cfg_pcu_cs_cmd);
1147 install_element(PCU_NODE, &cfg_pcu_no_cs_cmd);
Jacob Erlbeckb33e6752015-06-04 19:04:30 +02001148 install_element(PCU_NODE, &cfg_pcu_cs_max_cmd);
1149 install_element(PCU_NODE, &cfg_pcu_no_cs_max_cmd);
Jacob Erlbeck8322d082015-06-04 15:12:10 +02001150 install_element(PCU_NODE, &cfg_pcu_cs_err_limits_cmd);
1151 install_element(PCU_NODE, &cfg_pcu_no_cs_err_limits_cmd);
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +02001152 install_element(PCU_NODE, &cfg_pcu_cs_downgrade_thrsh_cmd);
1153 install_element(PCU_NODE, &cfg_pcu_no_cs_downgrade_thrsh_cmd);
Jacob Erlbeck94cde132015-06-09 09:44:36 +02001154 install_element(PCU_NODE, &cfg_pcu_cs_lqual_ranges_cmd);
Minh-Quang Nguyen1f189092017-08-16 09:50:06 -04001155 install_element(PCU_NODE, &cfg_pcu_mcs_lqual_ranges_cmd);
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +01001156 install_element(PCU_NODE, &cfg_pcu_mcs_cmd);
Aravind Sirsikar50b09702016-08-22 17:21:10 +05301157 install_element(PCU_NODE, &cfg_pcu_dl_arq_cmd);
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +01001158 install_element(PCU_NODE, &cfg_pcu_no_mcs_cmd);
Jacob Erlbeck0d058052016-01-07 11:48:28 +01001159 install_element(PCU_NODE, &cfg_pcu_mcs_max_cmd);
1160 install_element(PCU_NODE, &cfg_pcu_no_mcs_max_cmd);
Jacob Erlbeck36df7742016-01-19 15:53:30 +01001161 install_element(PCU_NODE, &cfg_pcu_window_size_cmd);
Andreas Eversberg24131bf2012-07-21 11:09:58 +02001162 install_element(PCU_NODE, &cfg_pcu_queue_lifetime_cmd);
1163 install_element(PCU_NODE, &cfg_pcu_queue_lifetime_inf_cmd);
1164 install_element(PCU_NODE, &cfg_pcu_no_queue_lifetime_cmd);
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +01001165 install_element(PCU_NODE, &cfg_pcu_queue_hysteresis_cmd);
1166 install_element(PCU_NODE, &cfg_pcu_no_queue_hysteresis_cmd);
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +02001167 install_element(PCU_NODE, &cfg_pcu_queue_codel_cmd);
1168 install_element(PCU_NODE, &cfg_pcu_queue_codel_interval_cmd);
1169 install_element(PCU_NODE, &cfg_pcu_no_queue_codel_cmd);
Jacob Erlbeckd0261b72015-04-02 13:58:09 +02001170 install_element(PCU_NODE, &cfg_pcu_queue_idle_ack_delay_cmd);
1171 install_element(PCU_NODE, &cfg_pcu_no_queue_idle_ack_delay_cmd);
Andreas Eversberga1503fa2012-07-22 08:58:09 +02001172 install_element(PCU_NODE, &cfg_pcu_alloc_cmd);
Andreas Eversberg07e97cf2012-08-07 16:00:56 +02001173 install_element(PCU_NODE, &cfg_pcu_two_phase_cmd);
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +02001174 install_element(PCU_NODE, &cfg_pcu_fc_interval_cmd);
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +02001175 install_element(PCU_NODE, &cfg_pcu_fc_bucket_time_cmd);
1176 install_element(PCU_NODE, &cfg_pcu_no_fc_bucket_time_cmd);
Jacob Erlbeck87d73412015-04-21 12:56:48 +02001177 install_element(PCU_NODE, &cfg_pcu_fc_bvc_bucket_size_cmd);
1178 install_element(PCU_NODE, &cfg_pcu_no_fc_bvc_bucket_size_cmd);
1179 install_element(PCU_NODE, &cfg_pcu_fc_bvc_leak_rate_cmd);
1180 install_element(PCU_NODE, &cfg_pcu_no_fc_bvc_leak_rate_cmd);
1181 install_element(PCU_NODE, &cfg_pcu_fc_ms_bucket_size_cmd);
1182 install_element(PCU_NODE, &cfg_pcu_no_fc_ms_bucket_size_cmd);
1183 install_element(PCU_NODE, &cfg_pcu_fc_ms_leak_rate_cmd);
1184 install_element(PCU_NODE, &cfg_pcu_no_fc_ms_leak_rate_cmd);
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +02001185 install_element(PCU_NODE, &cfg_pcu_alpha_cmd);
1186 install_element(PCU_NODE, &cfg_pcu_gamma_cmd);
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +01001187 install_element(PCU_NODE, &cfg_pcu_dl_tbf_idle_time_cmd);
1188 install_element(PCU_NODE, &cfg_pcu_no_dl_tbf_idle_time_cmd);
Oliver Smith45fdc442019-09-05 15:12:20 +02001189 install_element(PCU_NODE, &cfg_pcu_dl_tbf_preemptive_retransmission_cmd);
1190 install_element(PCU_NODE, &cfg_pcu_no_dl_tbf_preemptive_retransmission_cmd);
Jacob Erlbecka098c192015-05-28 16:11:19 +02001191 install_element(PCU_NODE, &cfg_pcu_ms_idle_time_cmd);
1192 install_element(PCU_NODE, &cfg_pcu_no_ms_idle_time_cmd);
Harald Welte717cdf52017-07-21 21:56:23 +02001193 install_element(PCU_NODE, &cfg_pcu_gsmtap_categ_cmd);
1194 install_element(PCU_NODE, &cfg_pcu_no_gsmtap_categ_cmd);
Pau Espin Pedrolc4178e52017-08-08 15:03:50 +02001195 install_element(PCU_NODE, &cfg_pcu_sock_cmd);
Harald Welte57d35152018-07-05 03:11:17 +02001196 install_element(PCU_NODE, &cfg_pcu_gb_dialect_cmd);
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +02001197 install_element(PCU_NODE, &cfg_pcu_timer_cmd);
Andreas Eversberg8b761a32012-07-20 21:50:31 +02001198
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +01001199 install_element_ve(&show_bts_stats_cmd);
Pau Espin Pedrola1ac2f02020-09-22 17:01:31 +02001200 install_element_ve(&show_bts_pdch_cmd);
Daniel Willmann772415f2014-01-15 17:06:51 +01001201 install_element_ve(&show_tbf_cmd);
Jacob Erlbeckf47f68a2015-06-04 10:23:24 +02001202 install_element_ve(&show_ms_all_cmd);
Jacob Erlbeck37e896d2015-06-05 16:33:33 +02001203 install_element_ve(&show_ms_tlli_cmd);
1204 install_element_ve(&show_ms_imsi_cmd);
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +02001205 install_element_ve(&show_bts_timer_cmd);
1206 install_element_ve(&show_timer_cmd);
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +01001207
Andreas Eversberg12942562012-07-12 14:31:57 +02001208 return 0;
1209}