blob: 92ff8eb4383fd880524fa0f94a3dc0b14b0801f1 [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 Pedrolc0a250d2021-01-21 18:46:13 +010017#include <osmocom/ctrl/ports.h>
Pau Espin Pedrolc4178e52017-08-08 15:03:50 +020018#include <osmocom/pcu/pcuif_proto.h>
Alexander Couzens290d9032020-09-16 21:52:02 +020019#include <osmocom/gprs/gprs_ns2.h>
Andreas Eversberg12942562012-07-12 14:31:57 +020020#include "pcu_vty.h"
Andreas Eversberg8b761a32012-07-20 21:50:31 +020021#include "gprs_rlcmac.h"
Max6dc90b82018-02-19 17:17:28 +010022#include <pdch.h>
Holger Hans Peter Freyther67ed34e2013-10-17 17:01:54 +020023#include "bts.h"
Jacob Erlbeckc0c580c2015-04-30 15:59:01 +020024#include "tbf.h"
Jacob Erlbeck62e96a32015-06-04 09:42:14 +020025#include "pcu_vty_functions.h"
26
Philipp Maier9459ebd2020-09-29 23:31:33 +020027#define X(x) (1 << x)
28
Harald Welte717cdf52017-07-21 21:56:23 +020029extern void *tall_pcu_ctx;
30
31static const struct value_string pcu_gsmtap_categ_names[] = {
32 { PCU_GSMTAP_C_DL_UNKNOWN, "dl-unknown" },
33 { PCU_GSMTAP_C_DL_DUMMY, "dl-dummy" },
34 { PCU_GSMTAP_C_DL_CTRL, "dl-ctrl" },
35 { PCU_GSMTAP_C_DL_DATA_GPRS, "dl-data-gprs" },
36 { PCU_GSMTAP_C_DL_DATA_EGPRS, "dl-data-egprs" },
Harald Weltebc219d52017-07-29 13:42:27 +020037 { PCU_GSMTAP_C_DL_PTCCH, "dl-ptcch" },
Pau Espin Pedrol58543702019-09-30 19:07:16 +020038 { PCU_GSMTAP_C_DL_AGCH, "dl-agch" },
39 { PCU_GSMTAP_C_DL_PCH, "dl-pch" },
Harald Welte717cdf52017-07-21 21:56:23 +020040
41 { PCU_GSMTAP_C_UL_UNKNOWN, "ul-unknown" },
42 { PCU_GSMTAP_C_UL_DUMMY, "ul-dummy" },
43 { PCU_GSMTAP_C_UL_CTRL, "ul-ctrl" },
44 { PCU_GSMTAP_C_UL_DATA_GPRS, "ul-data-gprs" },
45 { PCU_GSMTAP_C_UL_DATA_EGPRS, "ul-data-egprs" },
Pau Espin Pedrol1ec211f2019-09-30 18:33:14 +020046 { PCU_GSMTAP_C_UL_RACH, "ul-rach" },
Vadim Yanitskiy07b64872020-06-11 00:26:15 +070047 { PCU_GSMTAP_C_UL_PTCCH, "ul-ptcch" },
Harald Welte717cdf52017-07-21 21:56:23 +020048
49 { 0, NULL }
50};
51
52static const struct value_string pcu_gsmtap_categ_help[] = {
53 { PCU_GSMTAP_C_DL_UNKNOWN, "Unknown / Unparseable / Erroneous Downlink Blocks" },
54 { PCU_GSMTAP_C_DL_DUMMY, "Downlink Dummy Blocks" },
55 { PCU_GSMTAP_C_DL_CTRL, "Downlink Control Blocks" },
56 { PCU_GSMTAP_C_DL_DATA_GPRS, "Downlink Data Blocks (GPRS)" },
57 { PCU_GSMTAP_C_DL_DATA_EGPRS, "Downlink Data Blocks (EGPRS)" },
Harald Weltebc219d52017-07-29 13:42:27 +020058 { PCU_GSMTAP_C_DL_PTCCH, "Downlink PTCCH Blocks" },
Pau Espin Pedrol58543702019-09-30 19:07:16 +020059 { PCU_GSMTAP_C_DL_AGCH, "Downlink AGCH Blocks" },
60 { PCU_GSMTAP_C_DL_PCH, "Downlink PCH Blocks" },
Harald Welte717cdf52017-07-21 21:56:23 +020061
62 { PCU_GSMTAP_C_UL_UNKNOWN, "Unknown / Unparseable / Erroneous Downlink Blocks" },
63 { PCU_GSMTAP_C_UL_DUMMY, "Uplink Dummy Blocks" },
64 { PCU_GSMTAP_C_UL_CTRL, "Uplink Control Blocks" },
65 { PCU_GSMTAP_C_UL_DATA_GPRS, "Uplink Data Blocks (GPRS)" },
66 { PCU_GSMTAP_C_UL_DATA_EGPRS, "Uplink Data Blocks (EGPRS)" },
Pau Espin Pedrol1ec211f2019-09-30 18:33:14 +020067 { PCU_GSMTAP_C_UL_RACH, "Uplink RACH Bursts" },
Vadim Yanitskiy07b64872020-06-11 00:26:15 +070068 { PCU_GSMTAP_C_UL_PTCCH, "Uplink PTCCH Bursts" },
Harald Welte717cdf52017-07-21 21:56:23 +020069
70 { 0, NULL }
71};
72
73
74DEFUN(cfg_pcu_gsmtap_categ, cfg_pcu_gsmtap_categ_cmd, "HIDDEN", "HIDDEN")
75{
Harald Welte717cdf52017-07-21 21:56:23 +020076 int categ;
77
78 categ = get_string_value(pcu_gsmtap_categ_names, argv[0]);
79 if (categ < 0)
80 return CMD_WARNING;
81
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +010082 the_pcu->gsmtap_categ_mask |= (1 << categ);
Harald Welte717cdf52017-07-21 21:56:23 +020083
84 return CMD_SUCCESS;
85}
86
87DEFUN(cfg_pcu_no_gsmtap_categ, cfg_pcu_no_gsmtap_categ_cmd, "HIDDEN", "HIDDEN")
88{
Harald Welte717cdf52017-07-21 21:56:23 +020089 int categ;
90
91 categ = get_string_value(pcu_gsmtap_categ_names, argv[0]);
92 if (categ < 0)
93 return CMD_WARNING;
94
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +010095 the_pcu->gsmtap_categ_mask &= ~(1 << categ);
Harald Welte717cdf52017-07-21 21:56:23 +020096
97 return CMD_SUCCESS;
98}
99
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200100static struct cmd_node pcu_node = {
101 (enum node_type) PCU_NODE,
Jacob Erlbeckcc12f022015-04-09 15:45:24 +0200102 "%s(config-pcu)# ",
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200103 1,
104};
105
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200106static int config_write_pcu(struct vty *vty)
107{
Harald Welte717cdf52017-07-21 21:56:23 +0200108 unsigned int i;
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200109
110 vty_out(vty, "pcu%s", VTY_NEWLINE);
Pau Espin Pedrole8912222021-01-14 14:03:17 +0100111 vty_out(vty, " flow-control-interval %d%s", the_pcu->vty.fc_interval,
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200112 VTY_NEWLINE);
Pau Espin Pedrole8912222021-01-14 14:03:17 +0100113 if (the_pcu->vty.fc_bvc_bucket_size)
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200114 vty_out(vty, " flow-control force-bvc-bucket-size %d%s",
Pau Espin Pedrole8912222021-01-14 14:03:17 +0100115 the_pcu->vty.fc_bvc_bucket_size, VTY_NEWLINE);
116 if (the_pcu->vty.fc_bvc_leak_rate)
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200117 vty_out(vty, " flow-control force-bvc-leak-rate %d%s",
Pau Espin Pedrole8912222021-01-14 14:03:17 +0100118 the_pcu->vty.fc_bvc_leak_rate, VTY_NEWLINE);
119 if (the_pcu->vty.fc_ms_bucket_size)
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200120 vty_out(vty, " flow-control force-ms-bucket-size %d%s",
Pau Espin Pedrole8912222021-01-14 14:03:17 +0100121 the_pcu->vty.fc_ms_bucket_size, VTY_NEWLINE);
122 if (the_pcu->vty.fc_ms_leak_rate)
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200123 vty_out(vty, " flow-control force-ms-leak-rate %d%s",
Pau Espin Pedrole8912222021-01-14 14:03:17 +0100124 the_pcu->vty.fc_ms_leak_rate, VTY_NEWLINE);
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100125 if (the_pcu->vty.force_initial_cs) {
Pau Espin Pedrol793583e2021-01-14 16:20:57 +0100126 if (the_pcu->vty.initial_cs_ul == the_pcu->vty.initial_cs_dl)
127 vty_out(vty, " cs %d%s", the_pcu->vty.initial_cs_dl,
Andreas Eversberg499ff412012-10-03 14:21:36 +0200128 VTY_NEWLINE);
129 else
Pau Espin Pedrol793583e2021-01-14 16:20:57 +0100130 vty_out(vty, " cs %d %d%s", the_pcu->vty.initial_cs_dl,
131 the_pcu->vty.initial_cs_ul, VTY_NEWLINE);
Holger Hans Peter Freytherc421e8a2014-07-02 14:55:17 +0200132 }
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100133 if (the_pcu->vty.max_cs_dl && the_pcu->vty.max_cs_ul) {
134 if (the_pcu->vty.max_cs_ul == the_pcu->vty.max_cs_dl)
135 vty_out(vty, " cs max %d%s", the_pcu->vty.max_cs_dl,
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200136 VTY_NEWLINE);
137 else
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100138 vty_out(vty, " cs max %d %d%s", the_pcu->vty.max_cs_dl,
139 the_pcu->vty.max_cs_ul, VTY_NEWLINE);
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200140 }
Pau Espin Pedrole8dcf642021-01-14 13:17:01 +0100141 if (the_pcu->vty.cs_adj_enabled)
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200142 vty_out(vty, " cs threshold %d %d%s",
Pau Espin Pedrole8dcf642021-01-14 13:17:01 +0100143 the_pcu->vty.cs_adj_lower_limit, the_pcu->vty.cs_adj_upper_limit,
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200144 VTY_NEWLINE);
145 else
146 vty_out(vty, " no cs threshold%s", VTY_NEWLINE);
147
Pau Espin Pedrolad79b852021-01-14 13:20:55 +0100148 if (the_pcu->vty.cs_downgrade_threshold)
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +0200149 vty_out(vty, " cs downgrade-threshold %d%s",
Pau Espin Pedrolad79b852021-01-14 13:20:55 +0100150 the_pcu->vty.cs_downgrade_threshold, VTY_NEWLINE);
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +0200151 else
152 vty_out(vty, " no cs downgrade-threshold%s", VTY_NEWLINE);
153
Jacob Erlbeck94cde132015-06-09 09:44:36 +0200154 vty_out(vty, " cs link-quality-ranges cs1 %d cs2 %d %d cs3 %d %d cs4 %d%s",
Pau Espin Pedrol54b159a2021-01-14 13:30:04 +0100155 the_pcu->vty.cs_lqual_ranges[0].high,
156 the_pcu->vty.cs_lqual_ranges[1].low,
157 the_pcu->vty.cs_lqual_ranges[1].high,
158 the_pcu->vty.cs_lqual_ranges[2].low,
159 the_pcu->vty.cs_lqual_ranges[2].high,
160 the_pcu->vty.cs_lqual_ranges[3].low,
Jacob Erlbeck94cde132015-06-09 09:44:36 +0200161 VTY_NEWLINE);
162
Minh-Quang Nguyen1f189092017-08-16 09:50:06 -0400163 vty_out(vty, " mcs link-quality-ranges mcs1 %d mcs2 %d %d mcs3 %d %d mcs4 %d %d mcs5 %d %d mcs6 %d %d mcs7 %d %d mcs8 %d %d mcs9 %d%s",
Pau Espin Pedrol54b159a2021-01-14 13:30:04 +0100164 the_pcu->vty.mcs_lqual_ranges[0].high,
165 the_pcu->vty.mcs_lqual_ranges[1].low,
166 the_pcu->vty.mcs_lqual_ranges[1].high,
167 the_pcu->vty.mcs_lqual_ranges[2].low,
168 the_pcu->vty.mcs_lqual_ranges[2].high,
169 the_pcu->vty.mcs_lqual_ranges[3].low,
170 the_pcu->vty.mcs_lqual_ranges[3].high,
171 the_pcu->vty.mcs_lqual_ranges[4].low,
172 the_pcu->vty.mcs_lqual_ranges[4].high,
173 the_pcu->vty.mcs_lqual_ranges[5].low,
174 the_pcu->vty.mcs_lqual_ranges[5].high,
175 the_pcu->vty.mcs_lqual_ranges[6].low,
176 the_pcu->vty.mcs_lqual_ranges[6].high,
177 the_pcu->vty.mcs_lqual_ranges[7].low,
178 the_pcu->vty.mcs_lqual_ranges[7].high,
179 the_pcu->vty.mcs_lqual_ranges[8].low,
Minh-Quang Nguyen1f189092017-08-16 09:50:06 -0400180 VTY_NEWLINE);
181
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100182 if (the_pcu->vty.force_initial_mcs) {
Pau Espin Pedrol793583e2021-01-14 16:20:57 +0100183 if (the_pcu->vty.initial_mcs_ul == the_pcu->vty.initial_mcs_dl)
184 vty_out(vty, " mcs %d%s", the_pcu->vty.initial_mcs_dl,
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +0100185 VTY_NEWLINE);
186 else
Pau Espin Pedrol793583e2021-01-14 16:20:57 +0100187 vty_out(vty, " mcs %d %d%s", the_pcu->vty.initial_mcs_dl,
188 the_pcu->vty.initial_mcs_ul, VTY_NEWLINE);
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +0100189 }
Minh-Quang Nguyen1f189092017-08-16 09:50:06 -0400190
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100191 if (the_pcu->vty.max_mcs_dl && the_pcu->vty.max_mcs_ul) {
192 if (the_pcu->vty.max_mcs_ul == the_pcu->vty.max_mcs_dl)
193 vty_out(vty, " mcs max %d%s", the_pcu->vty.max_mcs_dl,
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100194 VTY_NEWLINE);
195 else
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100196 vty_out(vty, " mcs max %d %d%s", the_pcu->vty.max_mcs_dl,
197 the_pcu->vty.max_mcs_ul, VTY_NEWLINE);
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100198 }
199
Pau Espin Pedrol519d0712021-01-14 14:30:03 +0100200 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 +0100201 VTY_NEWLINE);
202
Pau Espin Pedrol97296b22021-01-14 13:08:02 +0100203 if (the_pcu->vty.dl_arq_type == EGPRS_ARQ2)
204 vty_out(vty, " egprs dl arq-type arq2%s", VTY_NEWLINE);
Aravind Sirsikar50b09702016-08-22 17:21:10 +0530205
Pau Espin Pedrolf473ec92021-01-14 14:45:14 +0100206 if (the_pcu->vty.force_llc_lifetime == 0xffff)
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200207 vty_out(vty, " queue lifetime infinite%s", VTY_NEWLINE);
Pau Espin Pedrolf473ec92021-01-14 14:45:14 +0100208 else if (the_pcu->vty.force_llc_lifetime)
209 vty_out(vty, " queue lifetime %d%s", the_pcu->vty.force_llc_lifetime,
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200210 VTY_NEWLINE);
Pau Espin Pedrolf473ec92021-01-14 14:45:14 +0100211 if (the_pcu->vty.llc_discard_csec)
212 vty_out(vty, " queue hysteresis %d%s", the_pcu->vty.llc_discard_csec,
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100213 VTY_NEWLINE);
Pau Espin Pedrolf473ec92021-01-14 14:45:14 +0100214 if (the_pcu->vty.llc_idle_ack_csec)
215 vty_out(vty, " queue idle-ack-delay %d%s", the_pcu->vty.llc_idle_ack_csec,
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200216 VTY_NEWLINE);
Pau Espin Pedrolf473ec92021-01-14 14:45:14 +0100217 if (the_pcu->vty.llc_codel_interval_msec == LLC_CODEL_USE_DEFAULT)
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200218 vty_out(vty, " queue codel%s", VTY_NEWLINE);
Pau Espin Pedrolf473ec92021-01-14 14:45:14 +0100219 else if (the_pcu->vty.llc_codel_interval_msec == LLC_CODEL_DISABLE)
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200220 vty_out(vty, " no queue codel%s", VTY_NEWLINE);
221 else
222 vty_out(vty, " queue codel interval %d%s",
Pau Espin Pedrolf473ec92021-01-14 14:45:14 +0100223 the_pcu->vty.llc_codel_interval_msec/10, VTY_NEWLINE);
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200224
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100225 if (the_pcu->alloc_algorithm == alloc_algorithm_a)
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200226 vty_out(vty, " alloc-algorithm a%s", VTY_NEWLINE);
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100227 if (the_pcu->alloc_algorithm == alloc_algorithm_b)
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200228 vty_out(vty, " alloc-algorithm b%s", VTY_NEWLINE);
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100229 if (the_pcu->alloc_algorithm == alloc_algorithm_dynamic)
Jacob Erlbeck400ec022015-07-14 13:31:48 +0200230 vty_out(vty, " alloc-algorithm dynamic%s", VTY_NEWLINE);
Pau Espin Pedrol03de8982021-01-14 12:48:50 +0100231 if (the_pcu->vty.force_two_phase)
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200232 vty_out(vty, " two-phase-access%s", VTY_NEWLINE);
Pau Espin Pedrola2814952021-01-14 12:53:53 +0100233 vty_out(vty, " alpha %d%s", the_pcu->vty.alpha, VTY_NEWLINE);
234 vty_out(vty, " gamma %d%s", the_pcu->vty.gamma * 2, VTY_NEWLINE);
Pau Espin Pedrol05f9f592021-01-14 12:56:58 +0100235 if (!the_pcu->vty.dl_tbf_preemptive_retransmission)
Oliver Smith45fdc442019-09-05 15:12:20 +0200236 vty_out(vty, " no dl-tbf-preemptive-retransmission%s", VTY_NEWLINE);
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100237 if (strcmp(the_pcu->pcu_sock_path, PCU_SOCK_DEFAULT))
238 vty_out(vty, " pcu-socket %s%s", the_pcu->pcu_sock_path, VTY_NEWLINE);
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200239
Harald Welte717cdf52017-07-21 21:56:23 +0200240 for (i = 0; i < 32; i++) {
241 unsigned int cs = (1 << i);
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100242 if (the_pcu->gsmtap_categ_mask & cs) {
Harald Welte717cdf52017-07-21 21:56:23 +0200243 vty_out(vty, " gsmtap-category %s%s",
244 get_value_string(pcu_gsmtap_categ_names, i), VTY_NEWLINE);
245 }
246 }
247
Alexander Couzensf7ec5252021-01-25 20:28:38 +0100248 if (the_pcu->vty.ns_dialect == GPRS_NS2_DIALECT_SNS)
Harald Welte57d35152018-07-05 03:11:17 +0200249 vty_out(vty, " gb-dialect ip-sns%s", VTY_NEWLINE);
250 else
251 vty_out(vty, " gb-dialect classic%s", VTY_NEWLINE);
252
Pau Espin Pedrol66e8a492021-02-17 20:24:59 +0100253 if (the_pcu->vty.neigh_ctrl_addr) {
254 vty_out(vty, " neighbor resolution %s %u%s",
255 the_pcu->vty.neigh_ctrl_addr, the_pcu->vty.neigh_ctrl_port, VTY_NEWLINE);
256 }
257
Pau Espin Pedrol924aaad2021-01-14 12:01:42 +0100258 osmo_tdef_vty_write(vty, the_pcu->T_defs, " timer ");
Pau Espin Pedrol18794422019-09-26 18:25:35 +0200259
Maxc9ce6f92018-01-30 17:53:02 +0100260 return CMD_SUCCESS;
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200261}
262
263/* per-BTS configuration */
Philipp Maier9459ebd2020-09-29 23:31:33 +0200264DEFUN_ATTR(cfg_pcu,
265 cfg_pcu_cmd,
266 "pcu",
267 "BTS specific configure",
268 CMD_ATTR_IMMEDIATE)
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200269{
270 vty->node = PCU_NODE;
271
272 return CMD_SUCCESS;
273}
274
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200275#define EGPRS_STR "EGPRS configuration\n"
276
Pau Espin Pedrol270c9ea2020-10-30 17:15:32 +0100277DEFUN_DEPRECATED(cfg_pcu_egprs,
278 cfg_pcu_egprs_cmd,
279 "egprs only",
280 EGPRS_STR "Use EGPRS and disable plain GPRS\n")
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200281{
Pau Espin Pedrol270c9ea2020-10-30 17:15:32 +0100282 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 +0200283 return CMD_SUCCESS;
284}
285
Pau Espin Pedrol270c9ea2020-10-30 17:15:32 +0100286DEFUN_DEPRECATED(cfg_pcu_no_egprs,
287 cfg_pcu_no_egprs_cmd,
288 "no egprs",
289 NO_STR EGPRS_STR)
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200290{
Pau Espin Pedrol270c9ea2020-10-30 17:15:32 +0100291 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 +0200292 return CMD_SUCCESS;
293}
294
Philipp Maier9459ebd2020-09-29 23:31:33 +0200295DEFUN_ATTR(cfg_pcu_fc_interval,
296 cfg_pcu_fc_interval_cmd,
297 "flow-control-interval <1-10>",
298 "Interval between sending subsequent Flow Control PDUs\n"
299 "Interval time in seconds\n",
300 CMD_ATTR_IMMEDIATE)
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200301{
Pau Espin Pedrole8912222021-01-14 14:03:17 +0100302 the_pcu->vty.fc_interval = atoi(argv[0]);
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200303 return CMD_SUCCESS;
304}
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200305#define FC_STR "BSSGP Flow Control configuration\n"
306#define FC_BMAX_STR(who) "Force a fixed value for the " who " bucket size\n"
307#define FC_LR_STR(who) "Force a fixed value for the " who " leak rate\n"
308
Philipp Maier9459ebd2020-09-29 23:31:33 +0200309DEFUN_ATTR(cfg_pcu_fc_bvc_bucket_size,
310 cfg_pcu_fc_bvc_bucket_size_cmd,
311 "flow-control force-bvc-bucket-size <1-6553500>",
312 FC_STR FC_BMAX_STR("BVC") "Bucket size in octets\n",
313 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200314{
Pau Espin Pedrole8912222021-01-14 14:03:17 +0100315 the_pcu->vty.fc_bvc_bucket_size = atoi(argv[0]);
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200316 return CMD_SUCCESS;
317}
318
Philipp Maier9459ebd2020-09-29 23:31:33 +0200319DEFUN_ATTR(cfg_pcu_no_fc_bvc_bucket_size,
320 cfg_pcu_no_fc_bvc_bucket_size_cmd,
321 "no flow-control force-bvc-bucket-size",
322 NO_STR FC_STR FC_BMAX_STR("BVC"),
323 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200324{
Pau Espin Pedrole8912222021-01-14 14:03:17 +0100325 the_pcu->vty.fc_bvc_bucket_size = 0;
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200326 return CMD_SUCCESS;
327}
328
Philipp Maier9459ebd2020-09-29 23:31:33 +0200329DEFUN_ATTR(cfg_pcu_fc_bvc_leak_rate,
330 cfg_pcu_fc_bvc_leak_rate_cmd,
331 "flow-control force-bvc-leak-rate <1-6553500>",
332 FC_STR FC_LR_STR("BVC") "Leak rate in bit/s\n",
333 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200334{
Pau Espin Pedrole8912222021-01-14 14:03:17 +0100335 the_pcu->vty.fc_bvc_leak_rate = atoi(argv[0]);
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200336
337 return CMD_SUCCESS;
338}
339
Philipp Maier9459ebd2020-09-29 23:31:33 +0200340DEFUN_ATTR(cfg_pcu_no_fc_bvc_leak_rate,
341 cfg_pcu_no_fc_bvc_leak_rate_cmd,
342 "no flow-control force-bvc-leak-rate",
343 NO_STR FC_STR FC_LR_STR("BVC"),
344 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200345{
Pau Espin Pedrole8912222021-01-14 14:03:17 +0100346 the_pcu->vty.fc_bvc_leak_rate = 0;
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200347 return CMD_SUCCESS;
348}
349
Philipp Maier9459ebd2020-09-29 23:31:33 +0200350DEFUN_ATTR(cfg_pcu_fc_ms_bucket_size,
351 cfg_pcu_fc_ms_bucket_size_cmd,
352 "flow-control force-ms-bucket-size <1-6553500>",
353 FC_STR FC_BMAX_STR("default MS") "Bucket size in octets\n",
354 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200355{
Pau Espin Pedrole8912222021-01-14 14:03:17 +0100356 the_pcu->vty.fc_ms_bucket_size = atoi(argv[0]);
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200357 return CMD_SUCCESS;
358}
359
Philipp Maier9459ebd2020-09-29 23:31:33 +0200360DEFUN_ATTR(cfg_pcu_no_fc_ms_bucket_size,
361 cfg_pcu_no_fc_ms_bucket_size_cmd,
362 "no flow-control force-ms-bucket-size",
363 NO_STR FC_STR FC_BMAX_STR("default MS"),
364 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200365{
Pau Espin Pedrole8912222021-01-14 14:03:17 +0100366 the_pcu->vty.fc_ms_bucket_size = 0;
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200367 return CMD_SUCCESS;
368}
369
Philipp Maier9459ebd2020-09-29 23:31:33 +0200370DEFUN_ATTR(cfg_pcu_fc_ms_leak_rate,
371 cfg_pcu_fc_ms_leak_rate_cmd,
372 "flow-control force-ms-leak-rate <1-6553500>",
373 FC_STR FC_LR_STR("default MS") "Leak rate in bit/s\n",
374 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200375{
Pau Espin Pedrole8912222021-01-14 14:03:17 +0100376 the_pcu->vty.fc_ms_leak_rate = atoi(argv[0]);
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200377 return CMD_SUCCESS;
378}
379
Philipp Maier9459ebd2020-09-29 23:31:33 +0200380DEFUN_ATTR(cfg_pcu_no_fc_ms_leak_rate,
381 cfg_pcu_no_fc_ms_leak_rate_cmd,
382 "no flow-control force-ms-leak-rate",
383 NO_STR FC_STR FC_LR_STR("default MS"),
384 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200385{
Pau Espin Pedrole8912222021-01-14 14:03:17 +0100386 the_pcu->vty.fc_ms_leak_rate = 0;
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200387 return CMD_SUCCESS;
388}
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200389
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200390#define FC_BTIME_STR "Set target downlink maximum queueing time (only affects the advertised bucket size)\n"
Philipp Maier9459ebd2020-09-29 23:31:33 +0200391DEFUN_ATTR(cfg_pcu_fc_bucket_time,
392 cfg_pcu_fc_bucket_time_cmd,
393 "flow-control bucket-time <1-65534>",
394 FC_STR FC_BTIME_STR "Time in centi-seconds\n",
395 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200396{
Pau Espin Pedrole8912222021-01-14 14:03:17 +0100397 the_pcu->vty.fc_bucket_time = atoi(argv[0]);
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200398 return CMD_SUCCESS;
399}
400
Philipp Maier9459ebd2020-09-29 23:31:33 +0200401DEFUN_ATTR(cfg_pcu_no_fc_bucket_time,
402 cfg_pcu_no_fc_bucket_time_cmd,
403 "no flow-control bucket-time",
404 NO_STR FC_STR FC_BTIME_STR,
405 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200406{
Pau Espin Pedrole8912222021-01-14 14:03:17 +0100407 the_pcu->vty.fc_bucket_time = 0;
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200408 return CMD_SUCCESS;
409}
410
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200411#define CS_STR "Coding Scheme configuration\n"
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200412
Philipp Maier9459ebd2020-09-29 23:31:33 +0200413DEFUN_ATTR(cfg_pcu_cs,
414 cfg_pcu_cs_cmd,
415 "cs <1-4> [<1-4>]",
416 CS_STR
417 "Initial CS value to be used (overrides BTS config)\n"
418 "Use a different initial CS value for the uplink",
419 CMD_ATTR_IMMEDIATE)
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200420{
Pau Espin Pedrol793583e2021-01-14 16:20:57 +0100421 uint8_t cs_dl, cs_ul;
422 cs_dl = atoi(argv[0]);
Andreas Eversberg499ff412012-10-03 14:21:36 +0200423 if (argc > 1)
Pau Espin Pedrol793583e2021-01-14 16:20:57 +0100424 cs_ul = atoi(argv[1]);
Andreas Eversberg499ff412012-10-03 14:21:36 +0200425 else
Pau Espin Pedrol793583e2021-01-14 16:20:57 +0100426 cs_ul = cs_dl;
427 the_pcu->vty.force_initial_cs = true;
428 gprs_pcu_set_initial_cs(the_pcu, cs_dl, cs_ul);
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200429 return CMD_SUCCESS;
430}
431
Philipp Maier9459ebd2020-09-29 23:31:33 +0200432DEFUN_ATTR(cfg_pcu_no_cs,
433 cfg_pcu_no_cs_cmd,
434 "no cs",
435 NO_STR CS_STR,
436 CMD_ATTR_IMMEDIATE)
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200437{
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100438 the_pcu->vty.force_initial_cs = false;
Pau Espin Pedrol793583e2021-01-14 16:20:57 +0100439 gprs_pcu_set_initial_cs(the_pcu, 0, 0);
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200440 return CMD_SUCCESS;
441}
442
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100443#define CS_MAX_STR "Set maximum values for adaptive CS selection (overrides BTS config)\n"
Philipp Maier9459ebd2020-09-29 23:31:33 +0200444DEFUN_ATTR(cfg_pcu_cs_max,
445 cfg_pcu_cs_max_cmd,
446 "cs max <1-4> [<1-4>]",
447 CS_STR
448 CS_MAX_STR
449 "Maximum CS value to be used\n"
450 "Use a different maximum CS value for the uplink",
451 CMD_ATTR_IMMEDIATE)
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200452{
Pau Espin Pedrol343ec9b2020-10-30 18:35:54 +0100453 uint8_t cs_dl = atoi(argv[0]);
454 uint8_t cs_ul;
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200455
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200456 if (argc > 1)
Pau Espin Pedrol343ec9b2020-10-30 18:35:54 +0100457 cs_ul = atoi(argv[1]);
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200458 else
Pau Espin Pedrol343ec9b2020-10-30 18:35:54 +0100459 cs_ul = cs_dl;
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200460
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100461 gprs_pcu_set_max_cs(the_pcu, cs_dl, cs_ul);
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200462 return CMD_SUCCESS;
463}
464
Philipp Maier9459ebd2020-09-29 23:31:33 +0200465DEFUN_ATTR(cfg_pcu_no_cs_max,
466 cfg_pcu_no_cs_max_cmd,
467 "no cs max",
468 NO_STR CS_STR CS_MAX_STR,
469 CMD_ATTR_IMMEDIATE)
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200470{
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100471 gprs_pcu_set_max_cs(the_pcu, 0, 0);
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200472 return CMD_SUCCESS;
473}
474
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100475#define MCS_STR "Modulation and Coding Scheme configuration (EGPRS)\n"
Philipp Maier9459ebd2020-09-29 23:31:33 +0200476DEFUN_ATTR(cfg_pcu_mcs,
477 cfg_pcu_mcs_cmd,
478 "mcs <1-9> [<1-9>]",
479 MCS_STR
480 "Initial MCS value to be used (default 1)\n"
481 "Use a different initial MCS value for the uplink",
482 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +0100483{
Pau Espin Pedrol793583e2021-01-14 16:20:57 +0100484 uint8_t mcs_dl, mcs_ul;
485 mcs_dl = atoi(argv[0]);
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +0100486 if (argc > 1)
Pau Espin Pedrol793583e2021-01-14 16:20:57 +0100487 mcs_ul = atoi(argv[1]);
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +0100488 else
Pau Espin Pedrol793583e2021-01-14 16:20:57 +0100489 mcs_ul = mcs_dl;
490 the_pcu->vty.force_initial_mcs = true;
491 gprs_pcu_set_initial_mcs(the_pcu, mcs_dl, mcs_ul);
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +0100492 return CMD_SUCCESS;
493}
494
Philipp Maier9459ebd2020-09-29 23:31:33 +0200495DEFUN_ATTR(cfg_pcu_no_mcs,
496 cfg_pcu_no_mcs_cmd,
497 "no mcs",
498 NO_STR MCS_STR,
499 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +0100500{
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100501 the_pcu->vty.force_initial_mcs = false;
Pau Espin Pedrol793583e2021-01-14 16:20:57 +0100502 gprs_pcu_set_initial_mcs(the_pcu, 0, 0);
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +0100503 return CMD_SUCCESS;
504}
505
Philipp Maier9459ebd2020-09-29 23:31:33 +0200506DEFUN_ATTR(cfg_pcu_mcs_max,
507 cfg_pcu_mcs_max_cmd,
508 "mcs max <1-9> [<1-9>]",
509 MCS_STR
510 CS_MAX_STR
511 "Maximum MCS value to be used\n"
512 "Use a different maximum MCS value for the uplink",
513 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100514{
Pau Espin Pedrol343ec9b2020-10-30 18:35:54 +0100515 uint8_t mcs_dl = atoi(argv[0]);
516 uint8_t mcs_ul;
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100517
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100518 if (argc > 1)
Pau Espin Pedrol343ec9b2020-10-30 18:35:54 +0100519 mcs_ul = atoi(argv[1]);
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100520 else
Pau Espin Pedrol343ec9b2020-10-30 18:35:54 +0100521 mcs_ul = mcs_dl;
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100522
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100523 gprs_pcu_set_max_mcs(the_pcu, mcs_dl, mcs_ul);
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100524 return CMD_SUCCESS;
525}
526
Philipp Maier9459ebd2020-09-29 23:31:33 +0200527DEFUN_ATTR(cfg_pcu_no_mcs_max,
528 cfg_pcu_no_mcs_max_cmd,
529 "no mcs max",
530 NO_STR MCS_STR CS_MAX_STR,
531 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100532{
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100533 gprs_pcu_set_max_mcs(the_pcu, 0, 0);
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100534 return CMD_SUCCESS;
535}
536
Aravind Sirsikar50b09702016-08-22 17:21:10 +0530537#define DL_STR "downlink specific configuration\n"
538
Philipp Maier9459ebd2020-09-29 23:31:33 +0200539DEFUN_ATTR(cfg_pcu_dl_arq_type,
540 cfg_pcu_dl_arq_cmd,
541 "egprs dl arq-type (spb|arq2)",
542 EGPRS_STR DL_STR "ARQ options\n"
543 "enable SPB(ARQ1) support\n"
544 "enable ARQ2 support",
545 CMD_ATTR_IMMEDIATE)
Aravind Sirsikar50b09702016-08-22 17:21:10 +0530546{
Aravind Sirsikar50b09702016-08-22 17:21:10 +0530547 if (!strcmp(argv[0], "arq2"))
Pau Espin Pedrol97296b22021-01-14 13:08:02 +0100548 the_pcu->vty.dl_arq_type = EGPRS_ARQ2;
Aravind Sirsikar50b09702016-08-22 17:21:10 +0530549 else
Pau Espin Pedrol97296b22021-01-14 13:08:02 +0100550 the_pcu->vty.dl_arq_type = EGPRS_ARQ1;
Aravind Sirsikar50b09702016-08-22 17:21:10 +0530551
552 return CMD_SUCCESS;
553}
554
Philipp Maier9459ebd2020-09-29 23:31:33 +0200555DEFUN_USRATTR(cfg_pcu_window_size,
556 cfg_pcu_window_size_cmd,
557 X(PCU_VTY_ATTR_NEW_TBF),
558 "window-size <0-1024> [<0-256>]",
559 "Window size configuration (b + N_PDCH * f)\n"
560 "Base value (b)\n"
561 "Factor for number of PDCH (f)")
Jacob Erlbeck36df7742016-01-19 15:53:30 +0100562{
Jacob Erlbeck36df7742016-01-19 15:53:30 +0100563 uint16_t b = atoi(argv[0]);
564
Pau Espin Pedrol519d0712021-01-14 14:30:03 +0100565 the_pcu->vty.ws_base = b;
Jacob Erlbeck36df7742016-01-19 15:53:30 +0100566 if (argc > 1) {
567 uint16_t f = atoi(argv[1]);
Pau Espin Pedrol519d0712021-01-14 14:30:03 +0100568 the_pcu->vty.ws_pdch = f;
Jacob Erlbeck36df7742016-01-19 15:53:30 +0100569 }
570
571 return CMD_SUCCESS;
572}
573
574
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200575#define QUEUE_STR "Packet queue options\n"
576#define LIFETIME_STR "Set lifetime limit of LLC frame in centi-seconds " \
577 "(overrides the value given by SGSN)\n"
578
Philipp Maier9459ebd2020-09-29 23:31:33 +0200579DEFUN_USRATTR(cfg_pcu_queue_lifetime,
580 cfg_pcu_queue_lifetime_cmd,
581 X(PCU_VTY_ATTR_NEW_TBF),
582 "queue lifetime <1-65534>",
583 QUEUE_STR LIFETIME_STR "Lifetime in centi-seconds")
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200584{
Jacob Erlbeck2acfbeb2015-04-30 17:55:16 +0200585 uint16_t csec = atoi(argv[0]);
Pau Espin Pedrolf473ec92021-01-14 14:45:14 +0100586 the_pcu->vty.force_llc_lifetime = csec;
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200587 return CMD_SUCCESS;
588}
589
Philipp Maier9459ebd2020-09-29 23:31:33 +0200590DEFUN_USRATTR(cfg_pcu_queue_lifetime_inf,
591 cfg_pcu_queue_lifetime_inf_cmd,
592 X(PCU_VTY_ATTR_NEW_TBF),
593 "queue lifetime infinite",
594 QUEUE_STR LIFETIME_STR "Infinite lifetime")
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200595{
Pau Espin Pedrolf473ec92021-01-14 14:45:14 +0100596 the_pcu->vty.force_llc_lifetime = 0xffff;
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200597 return CMD_SUCCESS;
598}
599
Philipp Maier9459ebd2020-09-29 23:31:33 +0200600DEFUN_USRATTR(cfg_pcu_no_queue_lifetime,
601 cfg_pcu_no_queue_lifetime_cmd,
602 X(PCU_VTY_ATTR_NEW_TBF),
603 "no queue lifetime",
604 NO_STR QUEUE_STR "Disable lifetime limit of LLC frame (use value given "
605 "by SGSN)\n")
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200606{
Pau Espin Pedrolf473ec92021-01-14 14:45:14 +0100607 the_pcu->vty.force_llc_lifetime = 0;
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200608 return CMD_SUCCESS;
609}
610
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100611#define QUEUE_HYSTERESIS_STR "Set lifetime hysteresis of LLC frame in centi-seconds " \
612 "(continue discarding until lifetime-hysteresis is reached)\n"
613
Philipp Maier9459ebd2020-09-29 23:31:33 +0200614DEFUN_USRATTR(cfg_pcu_queue_hysteresis,
615 cfg_pcu_queue_hysteresis_cmd,
616 X(PCU_VTY_ATTR_NEW_TBF),
617 "queue hysteresis <1-65535>",
618 QUEUE_STR QUEUE_HYSTERESIS_STR "Hysteresis in centi-seconds")
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100619{
Jacob Erlbeck2acfbeb2015-04-30 17:55:16 +0200620 uint16_t csec = atoi(argv[0]);
Pau Espin Pedrolf473ec92021-01-14 14:45:14 +0100621 the_pcu->vty.llc_discard_csec = csec;
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100622 return CMD_SUCCESS;
623}
624
Philipp Maier9459ebd2020-09-29 23:31:33 +0200625DEFUN_USRATTR(cfg_pcu_no_queue_hysteresis,
626 cfg_pcu_no_queue_hysteresis_cmd,
627 X(PCU_VTY_ATTR_NEW_TBF),
628 "no queue hysteresis",
629 NO_STR QUEUE_STR QUEUE_HYSTERESIS_STR)
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100630{
Pau Espin Pedrolf473ec92021-01-14 14:45:14 +0100631 the_pcu->vty.llc_discard_csec = 0;
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100632 return CMD_SUCCESS;
633}
634
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200635#define QUEUE_CODEL_STR "Set CoDel queue management\n"
Philipp Maier9459ebd2020-09-29 23:31:33 +0200636DEFUN_USRATTR(cfg_pcu_queue_codel,
637 cfg_pcu_queue_codel_cmd,
638 X(PCU_VTY_ATTR_NEW_SUBSCR),
639 "queue codel",
640 QUEUE_STR QUEUE_CODEL_STR)
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200641{
Pau Espin Pedrolf473ec92021-01-14 14:45:14 +0100642 the_pcu->vty.llc_codel_interval_msec = LLC_CODEL_USE_DEFAULT;
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200643 return CMD_SUCCESS;
644}
645
Philipp Maier9459ebd2020-09-29 23:31:33 +0200646DEFUN_USRATTR(cfg_pcu_queue_codel_interval,
647 cfg_pcu_queue_codel_interval_cmd,
648 X(PCU_VTY_ATTR_NEW_SUBSCR),
649 "queue codel interval <1-1000>",
650 QUEUE_STR QUEUE_CODEL_STR "Specify interval\n" "Interval in centi-seconds")
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200651{
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200652 uint16_t csec = atoi(argv[0]);
Pau Espin Pedrolf473ec92021-01-14 14:45:14 +0100653 the_pcu->vty.llc_codel_interval_msec = 10*csec;
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200654 return CMD_SUCCESS;
655}
656
Philipp Maier9459ebd2020-09-29 23:31:33 +0200657DEFUN_USRATTR(cfg_pcu_no_queue_codel,
658 cfg_pcu_no_queue_codel_cmd,
659 X(PCU_VTY_ATTR_NEW_SUBSCR),
660 "no queue codel",
661 NO_STR QUEUE_STR QUEUE_CODEL_STR)
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200662{
Pau Espin Pedrolf473ec92021-01-14 14:45:14 +0100663 the_pcu->vty.llc_codel_interval_msec = LLC_CODEL_DISABLE;
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200664 return CMD_SUCCESS;
665}
666
667
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200668#define QUEUE_IDLE_ACK_STR "Request an ACK after the last DL LLC frame in centi-seconds\n"
669
Philipp Maier9459ebd2020-09-29 23:31:33 +0200670DEFUN_ATTR(cfg_pcu_queue_idle_ack_delay,
671 cfg_pcu_queue_idle_ack_delay_cmd,
672 "queue idle-ack-delay <1-65535>",
673 QUEUE_STR QUEUE_IDLE_ACK_STR "Idle ACK delay in centi-seconds",
674 CMD_ATTR_IMMEDIATE)
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200675{
Jacob Erlbeck2acfbeb2015-04-30 17:55:16 +0200676 uint16_t csec = atoi(argv[0]);
Pau Espin Pedrolf473ec92021-01-14 14:45:14 +0100677 the_pcu->vty.llc_idle_ack_csec = csec;
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200678 return CMD_SUCCESS;
679}
680
Philipp Maier9459ebd2020-09-29 23:31:33 +0200681DEFUN_ATTR(cfg_pcu_no_queue_idle_ack_delay,
682 cfg_pcu_no_queue_idle_ack_delay_cmd,
683 "no queue idle-ack-delay",
684 NO_STR QUEUE_STR QUEUE_IDLE_ACK_STR,
685 CMD_ATTR_IMMEDIATE)
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200686{
Pau Espin Pedrolf473ec92021-01-14 14:45:14 +0100687 the_pcu->vty.llc_idle_ack_csec = 0;
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200688 return CMD_SUCCESS;
689}
690
Philipp Maier9459ebd2020-09-29 23:31:33 +0200691DEFUN_ATTR(cfg_pcu_alloc,
692 cfg_pcu_alloc_cmd,
693 "alloc-algorithm (a|b|dynamic)",
694 "Select slot allocation algorithm to use when assigning timeslots on "
695 "PACCH\n"
696 "Single slot is assigned only\n"
697 "Multiple slots are assigned for semi-duplex operation\n"
698 "Dynamically select the algorithm based on the system state\n",
699 CMD_ATTR_IMMEDIATE)
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200700{
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200701 switch (argv[0][0]) {
702 case 'a':
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100703 the_pcu->alloc_algorithm = alloc_algorithm_a;
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200704 break;
705 case 'b':
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100706 the_pcu->alloc_algorithm = alloc_algorithm_b;
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200707 break;
Jacob Erlbeck400ec022015-07-14 13:31:48 +0200708 default:
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100709 the_pcu->alloc_algorithm = alloc_algorithm_dynamic;
Jacob Erlbeck400ec022015-07-14 13:31:48 +0200710 break;
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200711 }
712
713 return CMD_SUCCESS;
714}
715
Philipp Maier9459ebd2020-09-29 23:31:33 +0200716DEFUN_ATTR(cfg_pcu_two_phase,
717 cfg_pcu_two_phase_cmd,
718 "two-phase-access",
719 "Force two phase access when MS requests single phase access\n",
720 CMD_ATTR_IMMEDIATE)
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200721{
Pau Espin Pedrol03de8982021-01-14 12:48:50 +0100722 the_pcu->vty.force_two_phase = 1;
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200723 return CMD_SUCCESS;
724}
725
Philipp Maier9459ebd2020-09-29 23:31:33 +0200726DEFUN_ATTR(cfg_pcu_no_two_phase,
727 cfg_pcu_no_two_phase_cmd,
728 "no two-phase-access",
729 NO_STR "Only use two phase access when requested my MS\n",
730 CMD_ATTR_IMMEDIATE)
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200731{
Pau Espin Pedrol03de8982021-01-14 12:48:50 +0100732 the_pcu->vty.force_two_phase = 0;
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200733 return CMD_SUCCESS;
734}
735
Philipp Maier9459ebd2020-09-29 23:31:33 +0200736DEFUN_ATTR(cfg_pcu_alpha,
737 cfg_pcu_alpha_cmd,
738 "alpha <0-10>",
739 "Alpha parameter for MS power control in units of 0.1 (see TS 05.08) "
740 "NOTE: Be sure to set Alpha value at System information 13 too.\n"
741 "Alpha in units of 0.1\n",
742 CMD_ATTR_IMMEDIATE)
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200743{
Pau Espin Pedrola2814952021-01-14 12:53:53 +0100744 the_pcu->vty.alpha = atoi(argv[0]);
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200745 return CMD_SUCCESS;
746}
747
Philipp Maier9459ebd2020-09-29 23:31:33 +0200748DEFUN_ATTR(cfg_pcu_gamma,
749 cfg_pcu_gamma_cmd,
750 "gamma <0-62>",
751 "Gamma parameter for MS power control in units of dB (see TS 05.08)\n"
752 "Gamma in even unit of dBs\n",
753 CMD_ATTR_IMMEDIATE)
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200754{
Pau Espin Pedrola2814952021-01-14 12:53:53 +0100755 the_pcu->vty.gamma = atoi(argv[0]) / 2;
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200756 return CMD_SUCCESS;
757}
758
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +0100759DEFUN(show_bts_stats,
760 show_bts_stats_cmd,
761 "show bts statistics",
762 SHOW_STR "BTS related functionality\nStatistics\n")
763{
Pau Espin Pedrold1049dc2021-01-18 17:14:14 +0100764 struct gprs_rlcmac_bts *bts;
765 llist_for_each_entry(bts, &the_pcu->bts_list, list) {
766 vty_out(vty, "BTS%" PRIu8 ":%s", bts->nr, VTY_NEWLINE);
767 vty_out_rate_ctr_group(vty, " ", bts_rate_counters(bts));
768 }
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +0100769 return CMD_SUCCESS;
Daniel Willmann772415f2014-01-15 17:06:51 +0100770}
771
Pau Espin Pedrola1ac2f02020-09-22 17:01:31 +0200772DEFUN(show_bts_pdch,
773 show_bts_pdch_cmd,
774 "show bts pdch",
775 SHOW_STR "BTS related functionality\nPDCH timeslots\n")
776{
Pau Espin Pedrold1049dc2021-01-18 17:14:14 +0100777 struct gprs_rlcmac_bts *bts;
778 llist_for_each_entry(bts, &the_pcu->bts_list, list) {
779 pcu_vty_show_bts_pdch(vty, bts);
780 }
781 return CMD_SUCCESS;
Pau Espin Pedrola1ac2f02020-09-22 17:01:31 +0200782}
783
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100784#define IDLE_TIME_STR "keep an idle DL TBF alive for the time given\n"
Pau Espin Pedrol2b5c6292019-09-09 13:41:00 +0200785DEFUN_DEPRECATED(cfg_pcu_dl_tbf_idle_time,
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100786 cfg_pcu_dl_tbf_idle_time_cmd,
787 "dl-tbf-idle-time <1-5000>",
788 IDLE_TIME_STR "idle time in msec")
789{
Pau Espin Pedrol2b5c6292019-09-09 13:41:00 +0200790 vty_out(vty, "%% 'dl-tbf-idle-time' is now deprecated: use 'timer X2031 <val>' instead%s", VTY_NEWLINE);
791
Pau Espin Pedrol924aaad2021-01-14 12:01:42 +0100792 if (osmo_tdef_set(the_pcu->T_defs, -2031, atoi(argv[0]), OSMO_TDEF_MS) < 0)
Pau Espin Pedrol2b5c6292019-09-09 13:41:00 +0200793 return CMD_WARNING;
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100794 return CMD_SUCCESS;
795}
796
Pau Espin Pedrol2b5c6292019-09-09 13:41:00 +0200797DEFUN_DEPRECATED(cfg_pcu_no_dl_tbf_idle_time,
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100798 cfg_pcu_no_dl_tbf_idle_time_cmd,
799 "no dl-tbf-idle-time",
800 NO_STR IDLE_TIME_STR)
801{
Pau Espin Pedrol2b5c6292019-09-09 13:41:00 +0200802 vty_out(vty, "%% 'no dl-tbf-idle-time' is now deprecated: use 'timer X2031 0' instead%s", VTY_NEWLINE);
803
Pau Espin Pedrol924aaad2021-01-14 12:01:42 +0100804 if (osmo_tdef_set(the_pcu->T_defs, -2031, 0, OSMO_TDEF_MS) < 0)
Pau Espin Pedrol2b5c6292019-09-09 13:41:00 +0200805 return CMD_WARNING;
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100806 return CMD_SUCCESS;
807}
808
Oliver Smith45fdc442019-09-05 15:12:20 +0200809#define RETRANSMISSION_STR "retransmit blocks even before the MS had a chance to receive them (better throughput," \
810 " less readable traces)"
Philipp Maier9459ebd2020-09-29 23:31:33 +0200811DEFUN_ATTR(cfg_pcu_dl_tbf_preemptive_retransmission,
812 cfg_pcu_dl_tbf_preemptive_retransmission_cmd,
813 "dl-tbf-preemptive-retransmission",
814 RETRANSMISSION_STR " (enabled by default)",
815 CMD_ATTR_IMMEDIATE)
Oliver Smith45fdc442019-09-05 15:12:20 +0200816{
Pau Espin Pedrol05f9f592021-01-14 12:56:58 +0100817 the_pcu->vty.dl_tbf_preemptive_retransmission = true;
Oliver Smith45fdc442019-09-05 15:12:20 +0200818 return CMD_SUCCESS;
819}
820
Philipp Maier9459ebd2020-09-29 23:31:33 +0200821DEFUN_ATTR(cfg_pcu_no_dl_tbf_preemptive_retransmission,
822 cfg_pcu_no_dl_tbf_preemptive_retransmission_cmd,
823 "no dl-tbf-preemptive-retransmission",
824 NO_STR RETRANSMISSION_STR,
825 CMD_ATTR_IMMEDIATE)
Oliver Smith45fdc442019-09-05 15:12:20 +0200826{
Pau Espin Pedrol05f9f592021-01-14 12:56:58 +0100827 the_pcu->vty.dl_tbf_preemptive_retransmission = false;
Oliver Smith45fdc442019-09-05 15:12:20 +0200828 return CMD_SUCCESS;
829}
830
Jacob Erlbecka098c192015-05-28 16:11:19 +0200831#define MS_IDLE_TIME_STR "keep an idle MS object alive for the time given\n"
Pau Espin Pedrol63700ea2019-09-09 13:19:06 +0200832DEFUN_DEPRECATED(cfg_pcu_ms_idle_time,
Jacob Erlbecka098c192015-05-28 16:11:19 +0200833 cfg_pcu_ms_idle_time_cmd,
834 "ms-idle-time <1-7200>",
835 MS_IDLE_TIME_STR "idle time in sec")
836{
Pau Espin Pedrol63700ea2019-09-09 13:19:06 +0200837 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 +0100838 if (osmo_tdef_set(the_pcu->T_defs, -2030, atoi(argv[0]), OSMO_TDEF_S) < 0)
Pau Espin Pedrol63700ea2019-09-09 13:19:06 +0200839 return CMD_WARNING;
Jacob Erlbecka098c192015-05-28 16:11:19 +0200840 return CMD_SUCCESS;
841}
842
Pau Espin Pedrol63700ea2019-09-09 13:19:06 +0200843DEFUN_DEPRECATED(cfg_pcu_no_ms_idle_time,
Jacob Erlbecka098c192015-05-28 16:11:19 +0200844 cfg_pcu_no_ms_idle_time_cmd,
845 "no ms-idle-time",
846 NO_STR MS_IDLE_TIME_STR)
847{
Pau Espin Pedrol63700ea2019-09-09 13:19:06 +0200848 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 +0100849 if (osmo_tdef_set(the_pcu->T_defs, -2030, 0, OSMO_TDEF_S) < 0)
Pau Espin Pedrol63700ea2019-09-09 13:19:06 +0200850 return CMD_WARNING;
Jacob Erlbecka098c192015-05-28 16:11:19 +0200851 return CMD_SUCCESS;
852}
853
Pau Espin Pedrol1e6eb302019-11-28 17:00:44 +0100854#define CS_ERR_LIMITS_STR "set thresholds for error rate based downlink (M)CS adjustment\n"
Philipp Maier9459ebd2020-09-29 23:31:33 +0200855DEFUN_ATTR(cfg_pcu_cs_err_limits,
856 cfg_pcu_cs_err_limits_cmd,
857 "cs threshold <0-100> <0-100>",
858 CS_STR CS_ERR_LIMITS_STR "lower limit in %\n" "upper limit in %\n",
859 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200860{
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200861 uint8_t lower_limit = atoi(argv[0]);
862 uint8_t upper_limit = atoi(argv[1]);
863
864 if (lower_limit > upper_limit) {
865 vty_out(vty,
866 "The lower limit must be less than or equal to the "
867 "upper limit.%s", VTY_NEWLINE);
868 return CMD_WARNING;
869 }
870
Pau Espin Pedrole8dcf642021-01-14 13:17:01 +0100871 the_pcu->vty.cs_adj_enabled = true;
872 the_pcu->vty.cs_adj_upper_limit = upper_limit;
873 the_pcu->vty.cs_adj_lower_limit = lower_limit;
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200874
875 return CMD_SUCCESS;
876}
877
Philipp Maier9459ebd2020-09-29 23:31:33 +0200878DEFUN_ATTR(cfg_pcu_no_cs_err_limits,
879 cfg_pcu_no_cs_err_limits_cmd,
880 "no cs threshold",
881 NO_STR CS_STR CS_ERR_LIMITS_STR,
882 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200883{
Pau Espin Pedrole8dcf642021-01-14 13:17:01 +0100884 the_pcu->vty.cs_adj_enabled = false;
885 the_pcu->vty.cs_adj_upper_limit = 100;
886 the_pcu->vty.cs_adj_lower_limit = 0;
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200887
888 return CMD_SUCCESS;
889}
890
Pau Espin Pedrol1e6eb302019-11-28 17:00:44 +0100891#define CS_DOWNGRADE_STR "set threshold for data size based downlink (M)CS downgrade\n"
Philipp Maier9459ebd2020-09-29 23:31:33 +0200892DEFUN_ATTR(cfg_pcu_cs_downgrade_thrsh,
893 cfg_pcu_cs_downgrade_thrsh_cmd,
894 "cs downgrade-threshold <1-10000>",
895 CS_STR CS_DOWNGRADE_STR "downgrade if less octets left\n",
896 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +0200897{
Pau Espin Pedrolad79b852021-01-14 13:20:55 +0100898 the_pcu->vty.cs_downgrade_threshold = atoi(argv[0]);
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +0200899 return CMD_SUCCESS;
900}
901
Philipp Maier9459ebd2020-09-29 23:31:33 +0200902DEFUN_ATTR(cfg_pcu_no_cs_downgrade_thrsh,
903 cfg_pcu_no_cs_downgrade_thrsh_cmd,
904 "no cs downgrade-threshold",
905 NO_STR CS_STR CS_DOWNGRADE_STR,
906 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +0200907{
Pau Espin Pedrolad79b852021-01-14 13:20:55 +0100908 the_pcu->vty.cs_downgrade_threshold = 0;
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +0200909 return CMD_SUCCESS;
910}
911
Philipp Maier9459ebd2020-09-29 23:31:33 +0200912DEFUN_ATTR(cfg_pcu_cs_lqual_ranges,
913 cfg_pcu_cs_lqual_ranges_cmd,
914 "cs link-quality-ranges cs1 <0-35> cs2 <0-35> <0-35> cs3 <0-35> <0-35> cs4 <0-35>",
915 CS_STR "Set link quality ranges for each uplink CS\n"
916 "Set quality range for CS-1 (high value only)\n"
917 "CS-1 high (dB)\n"
918 "Set quality range for CS-2\n"
919 "CS-2 low (dB)\n"
920 "CS-2 high (dB)\n"
921 "Set quality range for CS-3\n"
922 "CS-3 low (dB)\n"
923 "CS-3 high (dB)\n"
924 "Set quality range for CS-4 (low value only)\n"
925 "CS-4 low (dB)\n",
926 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck94cde132015-06-09 09:44:36 +0200927{
Jacob Erlbeck94cde132015-06-09 09:44:36 +0200928 uint8_t cs1_high = atoi(argv[0]);
929 uint8_t cs2_low = atoi(argv[1]);
930 uint8_t cs2_high = atoi(argv[2]);
931 uint8_t cs3_low = atoi(argv[3]);
932 uint8_t cs3_high = atoi(argv[4]);
933 uint8_t cs4_low = atoi(argv[5]);
934
Pau Espin Pedrol54b159a2021-01-14 13:30:04 +0100935 the_pcu->vty.cs_lqual_ranges[0].high = cs1_high;
936 the_pcu->vty.cs_lqual_ranges[1].low = cs2_low;
937 the_pcu->vty.cs_lqual_ranges[1].high = cs2_high;
938 the_pcu->vty.cs_lqual_ranges[2].low = cs3_low;
939 the_pcu->vty.cs_lqual_ranges[2].high = cs3_high;
940 the_pcu->vty.cs_lqual_ranges[3].low = cs4_low;
Jacob Erlbeck94cde132015-06-09 09:44:36 +0200941
942 return CMD_SUCCESS;
943}
944
Philipp Maier9459ebd2020-09-29 23:31:33 +0200945DEFUN_ATTR(cfg_pcu_mcs_lqual_ranges,
946 cfg_pcu_mcs_lqual_ranges_cmd,
947 "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>",
948 CS_STR "Set link quality ranges for each uplink MCS\n"
949 "Set quality range for MCS-1 (high value only)\n"
950 "MCS-1 high (dB)\n"
951 "Set quality range for MCS-2\n"
952 "MCS-2 high (dB)\n"
953 "MCS-2 low (dB)\n"
954 "Set quality range for MCS-3\n"
955 "MCS-3 high (dB)\n"
956 "MCS-3 low (dB)\n"
957 "Set quality range for MCS-4\n"
958 "MCS-4 high (dB)\n"
959 "MCS-4 low (dB)\n"
960 "Set quality range for MCS-5\n"
961 "MCS-5 high (dB)\n"
962 "MCS-5 low (dB)\n"
963 "Set quality range for MCS-6\n"
964 "MCS-6 low (dB)\n"
965 "MCS-6 high (dB)\n"
966 "Set quality range for MCS-7\n"
967 "MCS-7 low (dB)\n"
968 "MCS-7 high (dB)\n"
969 "Set quality range for MCS-8\n"
970 "MCS-8 low (dB)\n"
971 "MCS-8 high (dB)\n"
972 "Set quality range for MCS-9 (low value only)\n"
973 "MCS-9 low (dB)\n",
974 CMD_ATTR_IMMEDIATE)
Minh-Quang Nguyen1f189092017-08-16 09:50:06 -0400975{
Pau Espin Pedrol54b159a2021-01-14 13:30:04 +0100976 the_pcu->vty.mcs_lqual_ranges[0].high = atoi(argv[0]);
977 the_pcu->vty.mcs_lqual_ranges[1].low = atoi(argv[1]);
978 the_pcu->vty.mcs_lqual_ranges[1].high = atoi(argv[2]);
979 the_pcu->vty.mcs_lqual_ranges[2].low = atoi(argv[3]);
980 the_pcu->vty.mcs_lqual_ranges[2].high = atoi(argv[4]);
981 the_pcu->vty.mcs_lqual_ranges[3].low = atoi(argv[5]);
982 the_pcu->vty.mcs_lqual_ranges[3].high = atoi(argv[6]);
983 the_pcu->vty.mcs_lqual_ranges[4].low = atoi(argv[7]);
984 the_pcu->vty.mcs_lqual_ranges[4].high = atoi(argv[8]);
985 the_pcu->vty.mcs_lqual_ranges[5].low = atoi(argv[9]);
986 the_pcu->vty.mcs_lqual_ranges[5].high = atoi(argv[10]);
987 the_pcu->vty.mcs_lqual_ranges[6].low = atoi(argv[11]);
988 the_pcu->vty.mcs_lqual_ranges[6].high = atoi(argv[12]);
989 the_pcu->vty.mcs_lqual_ranges[7].low = atoi(argv[13]);
990 the_pcu->vty.mcs_lqual_ranges[7].high = atoi(argv[14]);
991 the_pcu->vty.mcs_lqual_ranges[8].low = atoi(argv[15]);
Minh-Quang Nguyen1f189092017-08-16 09:50:06 -0400992
993 return CMD_SUCCESS;
994}
995
Pau Espin Pedrolc4178e52017-08-08 15:03:50 +0200996DEFUN(cfg_pcu_sock,
997 cfg_pcu_sock_cmd,
998 "pcu-socket PATH",
999 "Configure the osmo-bts PCU socket file/path name\n"
1000 "Path of the socket to connect to\n")
1001{
Vadim Yanitskiyfc75cc02019-11-30 20:13:25 +07001002 if (vty->type != VTY_FILE)
1003 vty_out(vty, "Changing PCU socket path at run-time has no effect%s", VTY_NEWLINE);
1004
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +01001005 osmo_talloc_replace_string(tall_pcu_ctx, &the_pcu->pcu_sock_path, argv[0]);
Pau Espin Pedrolc4178e52017-08-08 15:03:50 +02001006
1007 return CMD_SUCCESS;
1008}
Jacob Erlbeck94cde132015-06-09 09:44:36 +02001009
Philipp Maier9459ebd2020-09-29 23:31:33 +02001010DEFUN_USRATTR(cfg_pcu_gb_dialect,
1011 cfg_pcu_gb_dialect_cmd,
1012 X(PCU_VTY_ATTR_NS_RESET),
1013 "gb-dialect (classic|ip-sns)",
1014 "Select which Gb interface dialect to use\n"
1015 "Classic Gb interface with NS-{RESET,BLOCK,UNBLOCK} and static configuration\n"
1016 "Modern Gb interface with IP-SNS (Sub Network Service) and dynamic configuration\n")
Harald Welte57d35152018-07-05 03:11:17 +02001017{
Alexander Couzens290d9032020-09-16 21:52:02 +02001018 if (!strcmp(argv[0], "ip-sns")) {
Alexander Couzensf7ec5252021-01-25 20:28:38 +01001019 the_pcu->vty.ns_dialect = GPRS_NS2_DIALECT_SNS;
Alexander Couzens290d9032020-09-16 21:52:02 +02001020 } else {
Alexander Couzensf7ec5252021-01-25 20:28:38 +01001021 the_pcu->vty.ns_dialect = GPRS_NS2_DIALECT_IPACCESS;
Alexander Couzens290d9032020-09-16 21:52:02 +02001022 }
Harald Welte57d35152018-07-05 03:11:17 +02001023
1024 return CMD_SUCCESS;
1025}
1026
Pau Espin Pedrolc0a250d2021-01-21 18:46:13 +01001027DEFUN(cfg_neighbor_resolution, cfg_neighbor_resolution_cmd,
1028 "neighbor resolution " VTY_IPV46_CMD " [<0-65535>]",
1029 "Manage local and remote-BSS neighbor cells\n"
1030 "Connect to Neighbor Resolution Service (CTRL interface) to given ip and port\n"
1031 "IPv4 address to connect to\n" "IPv6 address to connect to\n"
1032 "Port to connect to (default 4248)\n")
1033{
1034 osmo_talloc_replace_string(the_pcu, &the_pcu->vty.neigh_ctrl_addr, argv[0]);
1035 if (argc > 1)
1036 the_pcu->vty.neigh_ctrl_port = atoi(argv[1]);
1037 else
1038 the_pcu->vty.neigh_ctrl_port = OSMO_CTRL_PORT_BSC_NEIGH;
1039 return CMD_SUCCESS;
1040}
1041
1042
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +02001043DEFUN(show_bts_timer, show_bts_timer_cmd,
1044 "show bts-timer " OSMO_TDEF_VTY_ARG_T_OPTIONAL,
1045 SHOW_STR "Show BTS controlled timers\n"
1046 OSMO_TDEF_VTY_DOC_T)
1047{
Pau Espin Pedrold1049dc2021-01-18 17:14:14 +01001048 struct gprs_rlcmac_bts *bts;
1049 llist_for_each_entry(bts, &the_pcu->bts_list, list) {
1050 const char *T_arg = argc > 0 ? argv[0] : NULL;
1051 vty_out(vty, "BTS%" PRIu8 ":%s", bts->nr, VTY_NEWLINE);
1052 osmo_tdef_vty_show_cmd(vty, bts->T_defs_bts, T_arg, " ");
1053 }
1054 return CMD_SUCCESS;
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +02001055}
1056
1057DEFUN(show_timer, show_timer_cmd,
1058 "show timer " OSMO_TDEF_VTY_ARG_T_OPTIONAL,
1059 SHOW_STR "Show PCU timers\n"
1060 OSMO_TDEF_VTY_DOC_T)
1061{
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +02001062 const char *T_arg = argc > 0 ? argv[0] : NULL;
Pau Espin Pedrol924aaad2021-01-14 12:01:42 +01001063 return osmo_tdef_vty_show_cmd(vty, the_pcu->T_defs, T_arg, NULL);
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +02001064}
1065
Philipp Maier9459ebd2020-09-29 23:31:33 +02001066DEFUN_ATTR(cfg_pcu_timer, cfg_pcu_timer_cmd,
1067 "timer " OSMO_TDEF_VTY_ARG_SET_OPTIONAL,
1068 "Configure or show PCU timers\n"
1069 OSMO_TDEF_VTY_DOC_SET,
1070 CMD_ATTR_IMMEDIATE)
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +02001071{
Pau Espin Pedrolab7159f2021-01-26 17:51:44 +01001072 int rc;
1073 struct osmo_tdef *t;
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +02001074 /* If any arguments are missing, redirect to 'show' */
1075 if (argc < 2)
1076 return show_timer(self, vty, argc, argv);
Pau Espin Pedrolab7159f2021-01-26 17:51:44 +01001077 if ((rc = osmo_tdef_vty_set_cmd(vty, the_pcu->T_defs, argv)) != CMD_SUCCESS)
1078 return rc;
1079 t = osmo_tdef_vty_parse_T_arg(vty, the_pcu->T_defs, argv[0]);
1080 switch (t->T) {
1081 case PCU_TDEF_NEIGH_CACHE_ALIVE:
1082 neigh_cache_set_keep_time_interval(the_pcu->neigh_cache, t->val);
1083 break;
1084 case PCU_TDEF_SI_CACHE_ALIVE:
1085 si_cache_set_keep_time_interval(the_pcu->si_cache, t->val);
1086 break;
1087 default:
1088 break;
1089 }
1090 return CMD_SUCCESS;
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +02001091}
1092
Daniel Willmann772415f2014-01-15 17:06:51 +01001093DEFUN(show_tbf,
1094 show_tbf_cmd,
Max12a09872018-02-01 16:07:33 +01001095 "show tbf (all|ccch|pacch)",
1096 SHOW_STR "information about TBFs\n"
1097 "All TBFs\n"
1098 "TBFs allocated via CCCH\n"
1099 "TBFs allocated via PACCH\n")
Daniel Willmann772415f2014-01-15 17:06:51 +01001100{
Pau Espin Pedrold1049dc2021-01-18 17:14:14 +01001101 struct gprs_rlcmac_bts *bts;
1102 llist_for_each_entry(bts, &the_pcu->bts_list, list) {
1103 uint32_t flags = UINT32_MAX;
Max12a09872018-02-01 16:07:33 +01001104
Pau Espin Pedrold1049dc2021-01-18 17:14:14 +01001105 if (argv[0][0] == 'c')
1106 flags = (1 << GPRS_RLCMAC_FLAG_CCCH);
1107 else if (argv[0][0] == 'p')
1108 flags = (1 << GPRS_RLCMAC_FLAG_PACCH);
Max12a09872018-02-01 16:07:33 +01001109
Pau Espin Pedrold1049dc2021-01-18 17:14:14 +01001110 pcu_vty_show_tbf_all(vty, bts, flags);
1111 }
1112 return CMD_SUCCESS;
Daniel Willmann772415f2014-01-15 17:06:51 +01001113}
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +01001114
Jacob Erlbeckf47f68a2015-06-04 10:23:24 +02001115DEFUN(show_ms_all,
1116 show_ms_all_cmd,
1117 "show ms all",
1118 SHOW_STR "information about MSs\n" "All TBFs\n")
1119{
Pau Espin Pedrold1049dc2021-01-18 17:14:14 +01001120 struct gprs_rlcmac_bts *bts;
1121 llist_for_each_entry(bts, &the_pcu->bts_list, list) {
1122 pcu_vty_show_ms_all(vty, bts);
1123 }
1124 return CMD_SUCCESS;
Jacob Erlbeckf47f68a2015-06-04 10:23:24 +02001125}
1126
Jacob Erlbeck37e896d2015-06-05 16:33:33 +02001127DEFUN(show_ms_tlli,
1128 show_ms_tlli_cmd,
1129 "show ms tlli TLLI",
1130 SHOW_STR "information about MSs\n" "Select MS by TLLI\n" "TLLI as hex\n")
1131{
Pau Espin Pedrold1049dc2021-01-18 17:14:14 +01001132 struct gprs_rlcmac_bts *bts;
1133 llist_for_each_entry(bts, &the_pcu->bts_list, list) {
1134 char *endp = NULL;
1135 unsigned long long tlli = strtoll(argv[0], &endp, 16);
1136 if ((endp != NULL && *endp != 0) || tlli > 0xffffffffULL) {
1137 vty_out(vty, "Invalid TLLI.%s", VTY_NEWLINE);
1138 return CMD_WARNING;
1139 }
1140 pcu_vty_show_ms_by_tlli(vty, bts, (uint32_t)tlli);
Jacob Erlbeck37e896d2015-06-05 16:33:33 +02001141 }
Pau Espin Pedrold1049dc2021-01-18 17:14:14 +01001142 return CMD_SUCCESS;
Jacob Erlbeck37e896d2015-06-05 16:33:33 +02001143}
1144
1145DEFUN(show_ms_imsi,
1146 show_ms_imsi_cmd,
1147 "show ms imsi IMSI",
1148 SHOW_STR "information about MSs\n" "Select MS by IMSI\n" "IMSI\n")
1149{
Pau Espin Pedrold1049dc2021-01-18 17:14:14 +01001150 struct gprs_rlcmac_bts *bts;
1151 llist_for_each_entry(bts, &the_pcu->bts_list, list) {
1152 pcu_vty_show_ms_by_imsi(vty, bts, argv[0]);
1153 }
1154 return CMD_SUCCESS;
Jacob Erlbeck37e896d2015-06-05 16:33:33 +02001155}
1156
Andreas Eversberg12942562012-07-12 14:31:57 +02001157static const char pcu_copyright[] =
Harald Welted1e340f2013-01-17 12:24:29 +01001158 "Copyright (C) 2012 by Ivan Kluchnikov <kluchnikovi@gmail.com> and \r\n"
1159 " Andreas Eversberg <jolly@eversberg.eu>\r\n"
Andreas Eversberg12942562012-07-12 14:31:57 +02001160 "License GNU GPL version 2 or later\r\n"
1161 "This is free software: you are free to change and redistribute it.\r\n"
1162 "There is NO WARRANTY, to the extent permitted by law.\r\n";
1163
1164struct vty_app_info pcu_vty_info = {
Pau Espin Pedrold0fc9e82019-11-29 13:37:45 +01001165 .name = "OsmoPCU",
Andreas Eversberg12942562012-07-12 14:31:57 +02001166 .version = PACKAGE_VERSION,
1167 .copyright = pcu_copyright,
Philipp Maier9459ebd2020-09-29 23:31:33 +02001168 .usr_attr_desc = {
1169 [PCU_VTY_ATTR_NEW_TBF] = \
1170 "This command applies when a new TBF is begins",
1171 [PCU_VTY_ATTR_NEW_SUBSCR] = \
1172 "This command applies when a new subscriber attaches",
1173 [PCU_VTY_ATTR_NS_RESET] = \
1174 "This command applies when the NS is reset",
1175 },
1176 .usr_attr_letters = {
1177 [PCU_VTY_ATTR_NEW_TBF] = 'n',
1178 [PCU_VTY_ATTR_NEW_SUBSCR] = 's',
1179 [PCU_VTY_ATTR_NS_RESET] = 'r',
1180 },
Andreas Eversberg12942562012-07-12 14:31:57 +02001181};
1182
Pau Espin Pedrolcd2ac562019-08-05 14:30:44 +02001183int pcu_vty_init(void)
Andreas Eversberg12942562012-07-12 14:31:57 +02001184{
1185// install_element_ve(&show_pcu_cmd);
1186
Harald Welte717cdf52017-07-21 21:56:23 +02001187 cfg_pcu_gsmtap_categ_cmd.string = vty_cmd_string_from_valstr(tall_pcu_ctx, pcu_gsmtap_categ_names,
1188 "gsmtap-category (",
1189 "|",")", VTY_DO_LOWER);
1190 cfg_pcu_gsmtap_categ_cmd.doc = vty_cmd_string_from_valstr(tall_pcu_ctx, pcu_gsmtap_categ_help,
1191 "GSMTAP Category\n",
1192 "\n", "", 0);
1193 cfg_pcu_no_gsmtap_categ_cmd.string = vty_cmd_string_from_valstr(tall_pcu_ctx, pcu_gsmtap_categ_names,
1194 "no gsmtap-category (",
1195 "|",")", VTY_DO_LOWER);
1196 cfg_pcu_no_gsmtap_categ_cmd.doc = vty_cmd_string_from_valstr(tall_pcu_ctx, pcu_gsmtap_categ_help,
1197 NO_STR "GSMTAP Category\n",
1198 "\n", "", 0);
1199
Pau Espin Pedrolcd2ac562019-08-05 14:30:44 +02001200 logging_vty_add_cmds();
1201 osmo_stats_vty_add_cmds();
Vadim Yanitskiyd83c8ff2020-02-06 16:46:17 +07001202 osmo_talloc_vty_add_cmds();
Vadim Yanitskiy830ca262021-02-05 23:22:37 +01001203 osmo_fsm_vty_add_cmds();
Andreas Eversberg12942562012-07-12 14:31:57 +02001204
Andreas Eversberg8b761a32012-07-20 21:50:31 +02001205 install_node(&pcu_node, config_write_pcu);
1206 install_element(CONFIG_NODE, &cfg_pcu_cmd);
Jacob Erlbeck953c7892015-09-28 18:12:57 +02001207 install_element(PCU_NODE, &cfg_pcu_egprs_cmd);
1208 install_element(PCU_NODE, &cfg_pcu_no_egprs_cmd);
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +02001209 install_element(PCU_NODE, &cfg_pcu_no_two_phase_cmd);
Andreas Eversberg8b761a32012-07-20 21:50:31 +02001210 install_element(PCU_NODE, &cfg_pcu_cs_cmd);
1211 install_element(PCU_NODE, &cfg_pcu_no_cs_cmd);
Jacob Erlbeckb33e6752015-06-04 19:04:30 +02001212 install_element(PCU_NODE, &cfg_pcu_cs_max_cmd);
1213 install_element(PCU_NODE, &cfg_pcu_no_cs_max_cmd);
Jacob Erlbeck8322d082015-06-04 15:12:10 +02001214 install_element(PCU_NODE, &cfg_pcu_cs_err_limits_cmd);
1215 install_element(PCU_NODE, &cfg_pcu_no_cs_err_limits_cmd);
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +02001216 install_element(PCU_NODE, &cfg_pcu_cs_downgrade_thrsh_cmd);
1217 install_element(PCU_NODE, &cfg_pcu_no_cs_downgrade_thrsh_cmd);
Jacob Erlbeck94cde132015-06-09 09:44:36 +02001218 install_element(PCU_NODE, &cfg_pcu_cs_lqual_ranges_cmd);
Minh-Quang Nguyen1f189092017-08-16 09:50:06 -04001219 install_element(PCU_NODE, &cfg_pcu_mcs_lqual_ranges_cmd);
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +01001220 install_element(PCU_NODE, &cfg_pcu_mcs_cmd);
Aravind Sirsikar50b09702016-08-22 17:21:10 +05301221 install_element(PCU_NODE, &cfg_pcu_dl_arq_cmd);
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +01001222 install_element(PCU_NODE, &cfg_pcu_no_mcs_cmd);
Jacob Erlbeck0d058052016-01-07 11:48:28 +01001223 install_element(PCU_NODE, &cfg_pcu_mcs_max_cmd);
1224 install_element(PCU_NODE, &cfg_pcu_no_mcs_max_cmd);
Jacob Erlbeck36df7742016-01-19 15:53:30 +01001225 install_element(PCU_NODE, &cfg_pcu_window_size_cmd);
Andreas Eversberg24131bf2012-07-21 11:09:58 +02001226 install_element(PCU_NODE, &cfg_pcu_queue_lifetime_cmd);
1227 install_element(PCU_NODE, &cfg_pcu_queue_lifetime_inf_cmd);
1228 install_element(PCU_NODE, &cfg_pcu_no_queue_lifetime_cmd);
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +01001229 install_element(PCU_NODE, &cfg_pcu_queue_hysteresis_cmd);
1230 install_element(PCU_NODE, &cfg_pcu_no_queue_hysteresis_cmd);
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +02001231 install_element(PCU_NODE, &cfg_pcu_queue_codel_cmd);
1232 install_element(PCU_NODE, &cfg_pcu_queue_codel_interval_cmd);
1233 install_element(PCU_NODE, &cfg_pcu_no_queue_codel_cmd);
Jacob Erlbeckd0261b72015-04-02 13:58:09 +02001234 install_element(PCU_NODE, &cfg_pcu_queue_idle_ack_delay_cmd);
1235 install_element(PCU_NODE, &cfg_pcu_no_queue_idle_ack_delay_cmd);
Andreas Eversberga1503fa2012-07-22 08:58:09 +02001236 install_element(PCU_NODE, &cfg_pcu_alloc_cmd);
Andreas Eversberg07e97cf2012-08-07 16:00:56 +02001237 install_element(PCU_NODE, &cfg_pcu_two_phase_cmd);
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +02001238 install_element(PCU_NODE, &cfg_pcu_fc_interval_cmd);
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +02001239 install_element(PCU_NODE, &cfg_pcu_fc_bucket_time_cmd);
1240 install_element(PCU_NODE, &cfg_pcu_no_fc_bucket_time_cmd);
Jacob Erlbeck87d73412015-04-21 12:56:48 +02001241 install_element(PCU_NODE, &cfg_pcu_fc_bvc_bucket_size_cmd);
1242 install_element(PCU_NODE, &cfg_pcu_no_fc_bvc_bucket_size_cmd);
1243 install_element(PCU_NODE, &cfg_pcu_fc_bvc_leak_rate_cmd);
1244 install_element(PCU_NODE, &cfg_pcu_no_fc_bvc_leak_rate_cmd);
1245 install_element(PCU_NODE, &cfg_pcu_fc_ms_bucket_size_cmd);
1246 install_element(PCU_NODE, &cfg_pcu_no_fc_ms_bucket_size_cmd);
1247 install_element(PCU_NODE, &cfg_pcu_fc_ms_leak_rate_cmd);
1248 install_element(PCU_NODE, &cfg_pcu_no_fc_ms_leak_rate_cmd);
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +02001249 install_element(PCU_NODE, &cfg_pcu_alpha_cmd);
1250 install_element(PCU_NODE, &cfg_pcu_gamma_cmd);
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +01001251 install_element(PCU_NODE, &cfg_pcu_dl_tbf_idle_time_cmd);
1252 install_element(PCU_NODE, &cfg_pcu_no_dl_tbf_idle_time_cmd);
Oliver Smith45fdc442019-09-05 15:12:20 +02001253 install_element(PCU_NODE, &cfg_pcu_dl_tbf_preemptive_retransmission_cmd);
1254 install_element(PCU_NODE, &cfg_pcu_no_dl_tbf_preemptive_retransmission_cmd);
Jacob Erlbecka098c192015-05-28 16:11:19 +02001255 install_element(PCU_NODE, &cfg_pcu_ms_idle_time_cmd);
1256 install_element(PCU_NODE, &cfg_pcu_no_ms_idle_time_cmd);
Harald Welte717cdf52017-07-21 21:56:23 +02001257 install_element(PCU_NODE, &cfg_pcu_gsmtap_categ_cmd);
1258 install_element(PCU_NODE, &cfg_pcu_no_gsmtap_categ_cmd);
Pau Espin Pedrolc4178e52017-08-08 15:03:50 +02001259 install_element(PCU_NODE, &cfg_pcu_sock_cmd);
Harald Welte57d35152018-07-05 03:11:17 +02001260 install_element(PCU_NODE, &cfg_pcu_gb_dialect_cmd);
Pau Espin Pedrolc0a250d2021-01-21 18:46:13 +01001261 install_element(PCU_NODE, &cfg_neighbor_resolution_cmd);
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +02001262 install_element(PCU_NODE, &cfg_pcu_timer_cmd);
Andreas Eversberg8b761a32012-07-20 21:50:31 +02001263
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +01001264 install_element_ve(&show_bts_stats_cmd);
Pau Espin Pedrola1ac2f02020-09-22 17:01:31 +02001265 install_element_ve(&show_bts_pdch_cmd);
Daniel Willmann772415f2014-01-15 17:06:51 +01001266 install_element_ve(&show_tbf_cmd);
Jacob Erlbeckf47f68a2015-06-04 10:23:24 +02001267 install_element_ve(&show_ms_all_cmd);
Jacob Erlbeck37e896d2015-06-05 16:33:33 +02001268 install_element_ve(&show_ms_tlli_cmd);
1269 install_element_ve(&show_ms_imsi_cmd);
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +02001270 install_element_ve(&show_bts_timer_cmd);
1271 install_element_ve(&show_timer_cmd);
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +01001272
Andreas Eversberg12942562012-07-12 14:31:57 +02001273 return 0;
1274}