blob: 6db8b054ccdccdb036f7492293f9c552b5146e07 [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 Pedrol924aaad2021-01-14 12:01:42 +0100253 osmo_tdef_vty_write(vty, the_pcu->T_defs, " timer ");
Pau Espin Pedrol18794422019-09-26 18:25:35 +0200254
Maxc9ce6f92018-01-30 17:53:02 +0100255 return CMD_SUCCESS;
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200256}
257
258/* per-BTS configuration */
Philipp Maier9459ebd2020-09-29 23:31:33 +0200259DEFUN_ATTR(cfg_pcu,
260 cfg_pcu_cmd,
261 "pcu",
262 "BTS specific configure",
263 CMD_ATTR_IMMEDIATE)
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200264{
265 vty->node = PCU_NODE;
266
267 return CMD_SUCCESS;
268}
269
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200270#define EGPRS_STR "EGPRS configuration\n"
271
Pau Espin Pedrol270c9ea2020-10-30 17:15:32 +0100272DEFUN_DEPRECATED(cfg_pcu_egprs,
273 cfg_pcu_egprs_cmd,
274 "egprs only",
275 EGPRS_STR "Use EGPRS and disable plain GPRS\n")
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200276{
Pau Espin Pedrol270c9ea2020-10-30 17:15:32 +0100277 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 +0200278 return CMD_SUCCESS;
279}
280
Pau Espin Pedrol270c9ea2020-10-30 17:15:32 +0100281DEFUN_DEPRECATED(cfg_pcu_no_egprs,
282 cfg_pcu_no_egprs_cmd,
283 "no egprs",
284 NO_STR EGPRS_STR)
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200285{
Pau Espin Pedrol270c9ea2020-10-30 17:15:32 +0100286 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 +0200287 return CMD_SUCCESS;
288}
289
Philipp Maier9459ebd2020-09-29 23:31:33 +0200290DEFUN_ATTR(cfg_pcu_fc_interval,
291 cfg_pcu_fc_interval_cmd,
292 "flow-control-interval <1-10>",
293 "Interval between sending subsequent Flow Control PDUs\n"
294 "Interval time in seconds\n",
295 CMD_ATTR_IMMEDIATE)
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200296{
Pau Espin Pedrole8912222021-01-14 14:03:17 +0100297 the_pcu->vty.fc_interval = atoi(argv[0]);
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200298 return CMD_SUCCESS;
299}
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200300#define FC_STR "BSSGP Flow Control configuration\n"
301#define FC_BMAX_STR(who) "Force a fixed value for the " who " bucket size\n"
302#define FC_LR_STR(who) "Force a fixed value for the " who " leak rate\n"
303
Philipp Maier9459ebd2020-09-29 23:31:33 +0200304DEFUN_ATTR(cfg_pcu_fc_bvc_bucket_size,
305 cfg_pcu_fc_bvc_bucket_size_cmd,
306 "flow-control force-bvc-bucket-size <1-6553500>",
307 FC_STR FC_BMAX_STR("BVC") "Bucket size in octets\n",
308 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200309{
Pau Espin Pedrole8912222021-01-14 14:03:17 +0100310 the_pcu->vty.fc_bvc_bucket_size = atoi(argv[0]);
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200311 return CMD_SUCCESS;
312}
313
Philipp Maier9459ebd2020-09-29 23:31:33 +0200314DEFUN_ATTR(cfg_pcu_no_fc_bvc_bucket_size,
315 cfg_pcu_no_fc_bvc_bucket_size_cmd,
316 "no flow-control force-bvc-bucket-size",
317 NO_STR FC_STR FC_BMAX_STR("BVC"),
318 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200319{
Pau Espin Pedrole8912222021-01-14 14:03:17 +0100320 the_pcu->vty.fc_bvc_bucket_size = 0;
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200321 return CMD_SUCCESS;
322}
323
Philipp Maier9459ebd2020-09-29 23:31:33 +0200324DEFUN_ATTR(cfg_pcu_fc_bvc_leak_rate,
325 cfg_pcu_fc_bvc_leak_rate_cmd,
326 "flow-control force-bvc-leak-rate <1-6553500>",
327 FC_STR FC_LR_STR("BVC") "Leak rate in bit/s\n",
328 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200329{
Pau Espin Pedrole8912222021-01-14 14:03:17 +0100330 the_pcu->vty.fc_bvc_leak_rate = atoi(argv[0]);
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200331
332 return CMD_SUCCESS;
333}
334
Philipp Maier9459ebd2020-09-29 23:31:33 +0200335DEFUN_ATTR(cfg_pcu_no_fc_bvc_leak_rate,
336 cfg_pcu_no_fc_bvc_leak_rate_cmd,
337 "no flow-control force-bvc-leak-rate",
338 NO_STR FC_STR FC_LR_STR("BVC"),
339 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200340{
Pau Espin Pedrole8912222021-01-14 14:03:17 +0100341 the_pcu->vty.fc_bvc_leak_rate = 0;
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200342 return CMD_SUCCESS;
343}
344
Philipp Maier9459ebd2020-09-29 23:31:33 +0200345DEFUN_ATTR(cfg_pcu_fc_ms_bucket_size,
346 cfg_pcu_fc_ms_bucket_size_cmd,
347 "flow-control force-ms-bucket-size <1-6553500>",
348 FC_STR FC_BMAX_STR("default MS") "Bucket size in octets\n",
349 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200350{
Pau Espin Pedrole8912222021-01-14 14:03:17 +0100351 the_pcu->vty.fc_ms_bucket_size = atoi(argv[0]);
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200352 return CMD_SUCCESS;
353}
354
Philipp Maier9459ebd2020-09-29 23:31:33 +0200355DEFUN_ATTR(cfg_pcu_no_fc_ms_bucket_size,
356 cfg_pcu_no_fc_ms_bucket_size_cmd,
357 "no flow-control force-ms-bucket-size",
358 NO_STR FC_STR FC_BMAX_STR("default MS"),
359 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200360{
Pau Espin Pedrole8912222021-01-14 14:03:17 +0100361 the_pcu->vty.fc_ms_bucket_size = 0;
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200362 return CMD_SUCCESS;
363}
364
Philipp Maier9459ebd2020-09-29 23:31:33 +0200365DEFUN_ATTR(cfg_pcu_fc_ms_leak_rate,
366 cfg_pcu_fc_ms_leak_rate_cmd,
367 "flow-control force-ms-leak-rate <1-6553500>",
368 FC_STR FC_LR_STR("default MS") "Leak rate in bit/s\n",
369 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200370{
Pau Espin Pedrole8912222021-01-14 14:03:17 +0100371 the_pcu->vty.fc_ms_leak_rate = atoi(argv[0]);
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200372 return CMD_SUCCESS;
373}
374
Philipp Maier9459ebd2020-09-29 23:31:33 +0200375DEFUN_ATTR(cfg_pcu_no_fc_ms_leak_rate,
376 cfg_pcu_no_fc_ms_leak_rate_cmd,
377 "no flow-control force-ms-leak-rate",
378 NO_STR FC_STR FC_LR_STR("default MS"),
379 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200380{
Pau Espin Pedrole8912222021-01-14 14:03:17 +0100381 the_pcu->vty.fc_ms_leak_rate = 0;
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200382 return CMD_SUCCESS;
383}
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200384
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200385#define FC_BTIME_STR "Set target downlink maximum queueing time (only affects the advertised bucket size)\n"
Philipp Maier9459ebd2020-09-29 23:31:33 +0200386DEFUN_ATTR(cfg_pcu_fc_bucket_time,
387 cfg_pcu_fc_bucket_time_cmd,
388 "flow-control bucket-time <1-65534>",
389 FC_STR FC_BTIME_STR "Time in centi-seconds\n",
390 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200391{
Pau Espin Pedrole8912222021-01-14 14:03:17 +0100392 the_pcu->vty.fc_bucket_time = atoi(argv[0]);
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200393 return CMD_SUCCESS;
394}
395
Philipp Maier9459ebd2020-09-29 23:31:33 +0200396DEFUN_ATTR(cfg_pcu_no_fc_bucket_time,
397 cfg_pcu_no_fc_bucket_time_cmd,
398 "no flow-control bucket-time",
399 NO_STR FC_STR FC_BTIME_STR,
400 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200401{
Pau Espin Pedrole8912222021-01-14 14:03:17 +0100402 the_pcu->vty.fc_bucket_time = 0;
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200403 return CMD_SUCCESS;
404}
405
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200406#define CS_STR "Coding Scheme configuration\n"
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200407
Philipp Maier9459ebd2020-09-29 23:31:33 +0200408DEFUN_ATTR(cfg_pcu_cs,
409 cfg_pcu_cs_cmd,
410 "cs <1-4> [<1-4>]",
411 CS_STR
412 "Initial CS value to be used (overrides BTS config)\n"
413 "Use a different initial CS value for the uplink",
414 CMD_ATTR_IMMEDIATE)
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200415{
Pau Espin Pedrol793583e2021-01-14 16:20:57 +0100416 uint8_t cs_dl, cs_ul;
417 cs_dl = atoi(argv[0]);
Andreas Eversberg499ff412012-10-03 14:21:36 +0200418 if (argc > 1)
Pau Espin Pedrol793583e2021-01-14 16:20:57 +0100419 cs_ul = atoi(argv[1]);
Andreas Eversberg499ff412012-10-03 14:21:36 +0200420 else
Pau Espin Pedrol793583e2021-01-14 16:20:57 +0100421 cs_ul = cs_dl;
422 the_pcu->vty.force_initial_cs = true;
423 gprs_pcu_set_initial_cs(the_pcu, cs_dl, cs_ul);
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200424 return CMD_SUCCESS;
425}
426
Philipp Maier9459ebd2020-09-29 23:31:33 +0200427DEFUN_ATTR(cfg_pcu_no_cs,
428 cfg_pcu_no_cs_cmd,
429 "no cs",
430 NO_STR CS_STR,
431 CMD_ATTR_IMMEDIATE)
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200432{
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100433 the_pcu->vty.force_initial_cs = false;
Pau Espin Pedrol793583e2021-01-14 16:20:57 +0100434 gprs_pcu_set_initial_cs(the_pcu, 0, 0);
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200435 return CMD_SUCCESS;
436}
437
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100438#define CS_MAX_STR "Set maximum values for adaptive CS selection (overrides BTS config)\n"
Philipp Maier9459ebd2020-09-29 23:31:33 +0200439DEFUN_ATTR(cfg_pcu_cs_max,
440 cfg_pcu_cs_max_cmd,
441 "cs max <1-4> [<1-4>]",
442 CS_STR
443 CS_MAX_STR
444 "Maximum CS value to be used\n"
445 "Use a different maximum CS value for the uplink",
446 CMD_ATTR_IMMEDIATE)
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200447{
Pau Espin Pedrol343ec9b2020-10-30 18:35:54 +0100448 uint8_t cs_dl = atoi(argv[0]);
449 uint8_t cs_ul;
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200450
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200451 if (argc > 1)
Pau Espin Pedrol343ec9b2020-10-30 18:35:54 +0100452 cs_ul = atoi(argv[1]);
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200453 else
Pau Espin Pedrol343ec9b2020-10-30 18:35:54 +0100454 cs_ul = cs_dl;
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200455
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100456 gprs_pcu_set_max_cs(the_pcu, cs_dl, cs_ul);
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200457 return CMD_SUCCESS;
458}
459
Philipp Maier9459ebd2020-09-29 23:31:33 +0200460DEFUN_ATTR(cfg_pcu_no_cs_max,
461 cfg_pcu_no_cs_max_cmd,
462 "no cs max",
463 NO_STR CS_STR CS_MAX_STR,
464 CMD_ATTR_IMMEDIATE)
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200465{
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100466 gprs_pcu_set_max_cs(the_pcu, 0, 0);
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200467 return CMD_SUCCESS;
468}
469
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100470#define MCS_STR "Modulation and Coding Scheme configuration (EGPRS)\n"
Philipp Maier9459ebd2020-09-29 23:31:33 +0200471DEFUN_ATTR(cfg_pcu_mcs,
472 cfg_pcu_mcs_cmd,
473 "mcs <1-9> [<1-9>]",
474 MCS_STR
475 "Initial MCS value to be used (default 1)\n"
476 "Use a different initial MCS value for the uplink",
477 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +0100478{
Pau Espin Pedrol793583e2021-01-14 16:20:57 +0100479 uint8_t mcs_dl, mcs_ul;
480 mcs_dl = atoi(argv[0]);
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +0100481 if (argc > 1)
Pau Espin Pedrol793583e2021-01-14 16:20:57 +0100482 mcs_ul = atoi(argv[1]);
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +0100483 else
Pau Espin Pedrol793583e2021-01-14 16:20:57 +0100484 mcs_ul = mcs_dl;
485 the_pcu->vty.force_initial_mcs = true;
486 gprs_pcu_set_initial_mcs(the_pcu, mcs_dl, mcs_ul);
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +0100487 return CMD_SUCCESS;
488}
489
Philipp Maier9459ebd2020-09-29 23:31:33 +0200490DEFUN_ATTR(cfg_pcu_no_mcs,
491 cfg_pcu_no_mcs_cmd,
492 "no mcs",
493 NO_STR MCS_STR,
494 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +0100495{
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100496 the_pcu->vty.force_initial_mcs = false;
Pau Espin Pedrol793583e2021-01-14 16:20:57 +0100497 gprs_pcu_set_initial_mcs(the_pcu, 0, 0);
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +0100498 return CMD_SUCCESS;
499}
500
Philipp Maier9459ebd2020-09-29 23:31:33 +0200501DEFUN_ATTR(cfg_pcu_mcs_max,
502 cfg_pcu_mcs_max_cmd,
503 "mcs max <1-9> [<1-9>]",
504 MCS_STR
505 CS_MAX_STR
506 "Maximum MCS value to be used\n"
507 "Use a different maximum MCS value for the uplink",
508 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100509{
Pau Espin Pedrol343ec9b2020-10-30 18:35:54 +0100510 uint8_t mcs_dl = atoi(argv[0]);
511 uint8_t mcs_ul;
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100512
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100513 if (argc > 1)
Pau Espin Pedrol343ec9b2020-10-30 18:35:54 +0100514 mcs_ul = atoi(argv[1]);
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100515 else
Pau Espin Pedrol343ec9b2020-10-30 18:35:54 +0100516 mcs_ul = mcs_dl;
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100517
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100518 gprs_pcu_set_max_mcs(the_pcu, mcs_dl, mcs_ul);
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100519 return CMD_SUCCESS;
520}
521
Philipp Maier9459ebd2020-09-29 23:31:33 +0200522DEFUN_ATTR(cfg_pcu_no_mcs_max,
523 cfg_pcu_no_mcs_max_cmd,
524 "no mcs max",
525 NO_STR MCS_STR CS_MAX_STR,
526 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100527{
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100528 gprs_pcu_set_max_mcs(the_pcu, 0, 0);
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100529 return CMD_SUCCESS;
530}
531
Aravind Sirsikar50b09702016-08-22 17:21:10 +0530532#define DL_STR "downlink specific configuration\n"
533
Philipp Maier9459ebd2020-09-29 23:31:33 +0200534DEFUN_ATTR(cfg_pcu_dl_arq_type,
535 cfg_pcu_dl_arq_cmd,
536 "egprs dl arq-type (spb|arq2)",
537 EGPRS_STR DL_STR "ARQ options\n"
538 "enable SPB(ARQ1) support\n"
539 "enable ARQ2 support",
540 CMD_ATTR_IMMEDIATE)
Aravind Sirsikar50b09702016-08-22 17:21:10 +0530541{
Aravind Sirsikar50b09702016-08-22 17:21:10 +0530542 if (!strcmp(argv[0], "arq2"))
Pau Espin Pedrol97296b22021-01-14 13:08:02 +0100543 the_pcu->vty.dl_arq_type = EGPRS_ARQ2;
Aravind Sirsikar50b09702016-08-22 17:21:10 +0530544 else
Pau Espin Pedrol97296b22021-01-14 13:08:02 +0100545 the_pcu->vty.dl_arq_type = EGPRS_ARQ1;
Aravind Sirsikar50b09702016-08-22 17:21:10 +0530546
547 return CMD_SUCCESS;
548}
549
Philipp Maier9459ebd2020-09-29 23:31:33 +0200550DEFUN_USRATTR(cfg_pcu_window_size,
551 cfg_pcu_window_size_cmd,
552 X(PCU_VTY_ATTR_NEW_TBF),
553 "window-size <0-1024> [<0-256>]",
554 "Window size configuration (b + N_PDCH * f)\n"
555 "Base value (b)\n"
556 "Factor for number of PDCH (f)")
Jacob Erlbeck36df7742016-01-19 15:53:30 +0100557{
Jacob Erlbeck36df7742016-01-19 15:53:30 +0100558 uint16_t b = atoi(argv[0]);
559
Pau Espin Pedrol519d0712021-01-14 14:30:03 +0100560 the_pcu->vty.ws_base = b;
Jacob Erlbeck36df7742016-01-19 15:53:30 +0100561 if (argc > 1) {
562 uint16_t f = atoi(argv[1]);
Pau Espin Pedrol519d0712021-01-14 14:30:03 +0100563 the_pcu->vty.ws_pdch = f;
Jacob Erlbeck36df7742016-01-19 15:53:30 +0100564 }
565
566 return CMD_SUCCESS;
567}
568
569
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200570#define QUEUE_STR "Packet queue options\n"
571#define LIFETIME_STR "Set lifetime limit of LLC frame in centi-seconds " \
572 "(overrides the value given by SGSN)\n"
573
Philipp Maier9459ebd2020-09-29 23:31:33 +0200574DEFUN_USRATTR(cfg_pcu_queue_lifetime,
575 cfg_pcu_queue_lifetime_cmd,
576 X(PCU_VTY_ATTR_NEW_TBF),
577 "queue lifetime <1-65534>",
578 QUEUE_STR LIFETIME_STR "Lifetime in centi-seconds")
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200579{
Jacob Erlbeck2acfbeb2015-04-30 17:55:16 +0200580 uint16_t csec = atoi(argv[0]);
Pau Espin Pedrolf473ec92021-01-14 14:45:14 +0100581 the_pcu->vty.force_llc_lifetime = csec;
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200582 return CMD_SUCCESS;
583}
584
Philipp Maier9459ebd2020-09-29 23:31:33 +0200585DEFUN_USRATTR(cfg_pcu_queue_lifetime_inf,
586 cfg_pcu_queue_lifetime_inf_cmd,
587 X(PCU_VTY_ATTR_NEW_TBF),
588 "queue lifetime infinite",
589 QUEUE_STR LIFETIME_STR "Infinite lifetime")
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200590{
Pau Espin Pedrolf473ec92021-01-14 14:45:14 +0100591 the_pcu->vty.force_llc_lifetime = 0xffff;
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200592 return CMD_SUCCESS;
593}
594
Philipp Maier9459ebd2020-09-29 23:31:33 +0200595DEFUN_USRATTR(cfg_pcu_no_queue_lifetime,
596 cfg_pcu_no_queue_lifetime_cmd,
597 X(PCU_VTY_ATTR_NEW_TBF),
598 "no queue lifetime",
599 NO_STR QUEUE_STR "Disable lifetime limit of LLC frame (use value given "
600 "by SGSN)\n")
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200601{
Pau Espin Pedrolf473ec92021-01-14 14:45:14 +0100602 the_pcu->vty.force_llc_lifetime = 0;
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200603 return CMD_SUCCESS;
604}
605
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100606#define QUEUE_HYSTERESIS_STR "Set lifetime hysteresis of LLC frame in centi-seconds " \
607 "(continue discarding until lifetime-hysteresis is reached)\n"
608
Philipp Maier9459ebd2020-09-29 23:31:33 +0200609DEFUN_USRATTR(cfg_pcu_queue_hysteresis,
610 cfg_pcu_queue_hysteresis_cmd,
611 X(PCU_VTY_ATTR_NEW_TBF),
612 "queue hysteresis <1-65535>",
613 QUEUE_STR QUEUE_HYSTERESIS_STR "Hysteresis in centi-seconds")
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100614{
Jacob Erlbeck2acfbeb2015-04-30 17:55:16 +0200615 uint16_t csec = atoi(argv[0]);
Pau Espin Pedrolf473ec92021-01-14 14:45:14 +0100616 the_pcu->vty.llc_discard_csec = csec;
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100617 return CMD_SUCCESS;
618}
619
Philipp Maier9459ebd2020-09-29 23:31:33 +0200620DEFUN_USRATTR(cfg_pcu_no_queue_hysteresis,
621 cfg_pcu_no_queue_hysteresis_cmd,
622 X(PCU_VTY_ATTR_NEW_TBF),
623 "no queue hysteresis",
624 NO_STR QUEUE_STR QUEUE_HYSTERESIS_STR)
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100625{
Pau Espin Pedrolf473ec92021-01-14 14:45:14 +0100626 the_pcu->vty.llc_discard_csec = 0;
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100627 return CMD_SUCCESS;
628}
629
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200630#define QUEUE_CODEL_STR "Set CoDel queue management\n"
Philipp Maier9459ebd2020-09-29 23:31:33 +0200631DEFUN_USRATTR(cfg_pcu_queue_codel,
632 cfg_pcu_queue_codel_cmd,
633 X(PCU_VTY_ATTR_NEW_SUBSCR),
634 "queue codel",
635 QUEUE_STR QUEUE_CODEL_STR)
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200636{
Pau Espin Pedrolf473ec92021-01-14 14:45:14 +0100637 the_pcu->vty.llc_codel_interval_msec = LLC_CODEL_USE_DEFAULT;
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200638 return CMD_SUCCESS;
639}
640
Philipp Maier9459ebd2020-09-29 23:31:33 +0200641DEFUN_USRATTR(cfg_pcu_queue_codel_interval,
642 cfg_pcu_queue_codel_interval_cmd,
643 X(PCU_VTY_ATTR_NEW_SUBSCR),
644 "queue codel interval <1-1000>",
645 QUEUE_STR QUEUE_CODEL_STR "Specify interval\n" "Interval in centi-seconds")
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200646{
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200647 uint16_t csec = atoi(argv[0]);
Pau Espin Pedrolf473ec92021-01-14 14:45:14 +0100648 the_pcu->vty.llc_codel_interval_msec = 10*csec;
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200649 return CMD_SUCCESS;
650}
651
Philipp Maier9459ebd2020-09-29 23:31:33 +0200652DEFUN_USRATTR(cfg_pcu_no_queue_codel,
653 cfg_pcu_no_queue_codel_cmd,
654 X(PCU_VTY_ATTR_NEW_SUBSCR),
655 "no queue codel",
656 NO_STR QUEUE_STR QUEUE_CODEL_STR)
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200657{
Pau Espin Pedrolf473ec92021-01-14 14:45:14 +0100658 the_pcu->vty.llc_codel_interval_msec = LLC_CODEL_DISABLE;
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200659 return CMD_SUCCESS;
660}
661
662
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200663#define QUEUE_IDLE_ACK_STR "Request an ACK after the last DL LLC frame in centi-seconds\n"
664
Philipp Maier9459ebd2020-09-29 23:31:33 +0200665DEFUN_ATTR(cfg_pcu_queue_idle_ack_delay,
666 cfg_pcu_queue_idle_ack_delay_cmd,
667 "queue idle-ack-delay <1-65535>",
668 QUEUE_STR QUEUE_IDLE_ACK_STR "Idle ACK delay in centi-seconds",
669 CMD_ATTR_IMMEDIATE)
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200670{
Jacob Erlbeck2acfbeb2015-04-30 17:55:16 +0200671 uint16_t csec = atoi(argv[0]);
Pau Espin Pedrolf473ec92021-01-14 14:45:14 +0100672 the_pcu->vty.llc_idle_ack_csec = csec;
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200673 return CMD_SUCCESS;
674}
675
Philipp Maier9459ebd2020-09-29 23:31:33 +0200676DEFUN_ATTR(cfg_pcu_no_queue_idle_ack_delay,
677 cfg_pcu_no_queue_idle_ack_delay_cmd,
678 "no queue idle-ack-delay",
679 NO_STR QUEUE_STR QUEUE_IDLE_ACK_STR,
680 CMD_ATTR_IMMEDIATE)
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200681{
Pau Espin Pedrolf473ec92021-01-14 14:45:14 +0100682 the_pcu->vty.llc_idle_ack_csec = 0;
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200683 return CMD_SUCCESS;
684}
685
Philipp Maier9459ebd2020-09-29 23:31:33 +0200686DEFUN_ATTR(cfg_pcu_alloc,
687 cfg_pcu_alloc_cmd,
688 "alloc-algorithm (a|b|dynamic)",
689 "Select slot allocation algorithm to use when assigning timeslots on "
690 "PACCH\n"
691 "Single slot is assigned only\n"
692 "Multiple slots are assigned for semi-duplex operation\n"
693 "Dynamically select the algorithm based on the system state\n",
694 CMD_ATTR_IMMEDIATE)
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200695{
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200696 switch (argv[0][0]) {
697 case 'a':
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100698 the_pcu->alloc_algorithm = alloc_algorithm_a;
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200699 break;
700 case 'b':
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100701 the_pcu->alloc_algorithm = alloc_algorithm_b;
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200702 break;
Jacob Erlbeck400ec022015-07-14 13:31:48 +0200703 default:
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100704 the_pcu->alloc_algorithm = alloc_algorithm_dynamic;
Jacob Erlbeck400ec022015-07-14 13:31:48 +0200705 break;
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200706 }
707
708 return CMD_SUCCESS;
709}
710
Philipp Maier9459ebd2020-09-29 23:31:33 +0200711DEFUN_ATTR(cfg_pcu_two_phase,
712 cfg_pcu_two_phase_cmd,
713 "two-phase-access",
714 "Force two phase access when MS requests single phase access\n",
715 CMD_ATTR_IMMEDIATE)
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200716{
Pau Espin Pedrol03de8982021-01-14 12:48:50 +0100717 the_pcu->vty.force_two_phase = 1;
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200718 return CMD_SUCCESS;
719}
720
Philipp Maier9459ebd2020-09-29 23:31:33 +0200721DEFUN_ATTR(cfg_pcu_no_two_phase,
722 cfg_pcu_no_two_phase_cmd,
723 "no two-phase-access",
724 NO_STR "Only use two phase access when requested my MS\n",
725 CMD_ATTR_IMMEDIATE)
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200726{
Pau Espin Pedrol03de8982021-01-14 12:48:50 +0100727 the_pcu->vty.force_two_phase = 0;
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200728 return CMD_SUCCESS;
729}
730
Philipp Maier9459ebd2020-09-29 23:31:33 +0200731DEFUN_ATTR(cfg_pcu_alpha,
732 cfg_pcu_alpha_cmd,
733 "alpha <0-10>",
734 "Alpha parameter for MS power control in units of 0.1 (see TS 05.08) "
735 "NOTE: Be sure to set Alpha value at System information 13 too.\n"
736 "Alpha in units of 0.1\n",
737 CMD_ATTR_IMMEDIATE)
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200738{
Pau Espin Pedrola2814952021-01-14 12:53:53 +0100739 the_pcu->vty.alpha = atoi(argv[0]);
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200740 return CMD_SUCCESS;
741}
742
Philipp Maier9459ebd2020-09-29 23:31:33 +0200743DEFUN_ATTR(cfg_pcu_gamma,
744 cfg_pcu_gamma_cmd,
745 "gamma <0-62>",
746 "Gamma parameter for MS power control in units of dB (see TS 05.08)\n"
747 "Gamma in even unit of dBs\n",
748 CMD_ATTR_IMMEDIATE)
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200749{
Pau Espin Pedrola2814952021-01-14 12:53:53 +0100750 the_pcu->vty.gamma = atoi(argv[0]) / 2;
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200751 return CMD_SUCCESS;
752}
753
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +0100754DEFUN(show_bts_stats,
755 show_bts_stats_cmd,
756 "show bts statistics",
757 SHOW_STR "BTS related functionality\nStatistics\n")
758{
Pau Espin Pedrold1049dc2021-01-18 17:14:14 +0100759 struct gprs_rlcmac_bts *bts;
760 llist_for_each_entry(bts, &the_pcu->bts_list, list) {
761 vty_out(vty, "BTS%" PRIu8 ":%s", bts->nr, VTY_NEWLINE);
762 vty_out_rate_ctr_group(vty, " ", bts_rate_counters(bts));
763 }
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +0100764 return CMD_SUCCESS;
Daniel Willmann772415f2014-01-15 17:06:51 +0100765}
766
Pau Espin Pedrola1ac2f02020-09-22 17:01:31 +0200767DEFUN(show_bts_pdch,
768 show_bts_pdch_cmd,
769 "show bts pdch",
770 SHOW_STR "BTS related functionality\nPDCH timeslots\n")
771{
Pau Espin Pedrold1049dc2021-01-18 17:14:14 +0100772 struct gprs_rlcmac_bts *bts;
773 llist_for_each_entry(bts, &the_pcu->bts_list, list) {
774 pcu_vty_show_bts_pdch(vty, bts);
775 }
776 return CMD_SUCCESS;
Pau Espin Pedrola1ac2f02020-09-22 17:01:31 +0200777}
778
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100779#define IDLE_TIME_STR "keep an idle DL TBF alive for the time given\n"
Pau Espin Pedrol2b5c6292019-09-09 13:41:00 +0200780DEFUN_DEPRECATED(cfg_pcu_dl_tbf_idle_time,
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100781 cfg_pcu_dl_tbf_idle_time_cmd,
782 "dl-tbf-idle-time <1-5000>",
783 IDLE_TIME_STR "idle time in msec")
784{
Pau Espin Pedrol2b5c6292019-09-09 13:41:00 +0200785 vty_out(vty, "%% 'dl-tbf-idle-time' is now deprecated: use 'timer X2031 <val>' instead%s", VTY_NEWLINE);
786
Pau Espin Pedrol924aaad2021-01-14 12:01:42 +0100787 if (osmo_tdef_set(the_pcu->T_defs, -2031, atoi(argv[0]), OSMO_TDEF_MS) < 0)
Pau Espin Pedrol2b5c6292019-09-09 13:41:00 +0200788 return CMD_WARNING;
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100789 return CMD_SUCCESS;
790}
791
Pau Espin Pedrol2b5c6292019-09-09 13:41:00 +0200792DEFUN_DEPRECATED(cfg_pcu_no_dl_tbf_idle_time,
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100793 cfg_pcu_no_dl_tbf_idle_time_cmd,
794 "no dl-tbf-idle-time",
795 NO_STR IDLE_TIME_STR)
796{
Pau Espin Pedrol2b5c6292019-09-09 13:41:00 +0200797 vty_out(vty, "%% 'no dl-tbf-idle-time' is now deprecated: use 'timer X2031 0' instead%s", VTY_NEWLINE);
798
Pau Espin Pedrol924aaad2021-01-14 12:01:42 +0100799 if (osmo_tdef_set(the_pcu->T_defs, -2031, 0, OSMO_TDEF_MS) < 0)
Pau Espin Pedrol2b5c6292019-09-09 13:41:00 +0200800 return CMD_WARNING;
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100801 return CMD_SUCCESS;
802}
803
Oliver Smith45fdc442019-09-05 15:12:20 +0200804#define RETRANSMISSION_STR "retransmit blocks even before the MS had a chance to receive them (better throughput," \
805 " less readable traces)"
Philipp Maier9459ebd2020-09-29 23:31:33 +0200806DEFUN_ATTR(cfg_pcu_dl_tbf_preemptive_retransmission,
807 cfg_pcu_dl_tbf_preemptive_retransmission_cmd,
808 "dl-tbf-preemptive-retransmission",
809 RETRANSMISSION_STR " (enabled by default)",
810 CMD_ATTR_IMMEDIATE)
Oliver Smith45fdc442019-09-05 15:12:20 +0200811{
Pau Espin Pedrol05f9f592021-01-14 12:56:58 +0100812 the_pcu->vty.dl_tbf_preemptive_retransmission = true;
Oliver Smith45fdc442019-09-05 15:12:20 +0200813 return CMD_SUCCESS;
814}
815
Philipp Maier9459ebd2020-09-29 23:31:33 +0200816DEFUN_ATTR(cfg_pcu_no_dl_tbf_preemptive_retransmission,
817 cfg_pcu_no_dl_tbf_preemptive_retransmission_cmd,
818 "no dl-tbf-preemptive-retransmission",
819 NO_STR RETRANSMISSION_STR,
820 CMD_ATTR_IMMEDIATE)
Oliver Smith45fdc442019-09-05 15:12:20 +0200821{
Pau Espin Pedrol05f9f592021-01-14 12:56:58 +0100822 the_pcu->vty.dl_tbf_preemptive_retransmission = false;
Oliver Smith45fdc442019-09-05 15:12:20 +0200823 return CMD_SUCCESS;
824}
825
Jacob Erlbecka098c192015-05-28 16:11:19 +0200826#define MS_IDLE_TIME_STR "keep an idle MS object alive for the time given\n"
Pau Espin Pedrol63700ea2019-09-09 13:19:06 +0200827DEFUN_DEPRECATED(cfg_pcu_ms_idle_time,
Jacob Erlbecka098c192015-05-28 16:11:19 +0200828 cfg_pcu_ms_idle_time_cmd,
829 "ms-idle-time <1-7200>",
830 MS_IDLE_TIME_STR "idle time in sec")
831{
Pau Espin Pedrol63700ea2019-09-09 13:19:06 +0200832 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 +0100833 if (osmo_tdef_set(the_pcu->T_defs, -2030, atoi(argv[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 Pedrol63700ea2019-09-09 13:19:06 +0200838DEFUN_DEPRECATED(cfg_pcu_no_ms_idle_time,
Jacob Erlbecka098c192015-05-28 16:11:19 +0200839 cfg_pcu_no_ms_idle_time_cmd,
840 "no ms-idle-time",
841 NO_STR MS_IDLE_TIME_STR)
842{
Pau Espin Pedrol63700ea2019-09-09 13:19:06 +0200843 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 +0100844 if (osmo_tdef_set(the_pcu->T_defs, -2030, 0, OSMO_TDEF_S) < 0)
Pau Espin Pedrol63700ea2019-09-09 13:19:06 +0200845 return CMD_WARNING;
Jacob Erlbecka098c192015-05-28 16:11:19 +0200846 return CMD_SUCCESS;
847}
848
Pau Espin Pedrol1e6eb302019-11-28 17:00:44 +0100849#define CS_ERR_LIMITS_STR "set thresholds for error rate based downlink (M)CS adjustment\n"
Philipp Maier9459ebd2020-09-29 23:31:33 +0200850DEFUN_ATTR(cfg_pcu_cs_err_limits,
851 cfg_pcu_cs_err_limits_cmd,
852 "cs threshold <0-100> <0-100>",
853 CS_STR CS_ERR_LIMITS_STR "lower limit in %\n" "upper limit in %\n",
854 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200855{
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200856 uint8_t lower_limit = atoi(argv[0]);
857 uint8_t upper_limit = atoi(argv[1]);
858
859 if (lower_limit > upper_limit) {
860 vty_out(vty,
861 "The lower limit must be less than or equal to the "
862 "upper limit.%s", VTY_NEWLINE);
863 return CMD_WARNING;
864 }
865
Pau Espin Pedrole8dcf642021-01-14 13:17:01 +0100866 the_pcu->vty.cs_adj_enabled = true;
867 the_pcu->vty.cs_adj_upper_limit = upper_limit;
868 the_pcu->vty.cs_adj_lower_limit = lower_limit;
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200869
870 return CMD_SUCCESS;
871}
872
Philipp Maier9459ebd2020-09-29 23:31:33 +0200873DEFUN_ATTR(cfg_pcu_no_cs_err_limits,
874 cfg_pcu_no_cs_err_limits_cmd,
875 "no cs threshold",
876 NO_STR CS_STR CS_ERR_LIMITS_STR,
877 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200878{
Pau Espin Pedrole8dcf642021-01-14 13:17:01 +0100879 the_pcu->vty.cs_adj_enabled = false;
880 the_pcu->vty.cs_adj_upper_limit = 100;
881 the_pcu->vty.cs_adj_lower_limit = 0;
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200882
883 return CMD_SUCCESS;
884}
885
Pau Espin Pedrol1e6eb302019-11-28 17:00:44 +0100886#define CS_DOWNGRADE_STR "set threshold for data size based downlink (M)CS downgrade\n"
Philipp Maier9459ebd2020-09-29 23:31:33 +0200887DEFUN_ATTR(cfg_pcu_cs_downgrade_thrsh,
888 cfg_pcu_cs_downgrade_thrsh_cmd,
889 "cs downgrade-threshold <1-10000>",
890 CS_STR CS_DOWNGRADE_STR "downgrade if less octets left\n",
891 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +0200892{
Pau Espin Pedrolad79b852021-01-14 13:20:55 +0100893 the_pcu->vty.cs_downgrade_threshold = atoi(argv[0]);
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +0200894 return CMD_SUCCESS;
895}
896
Philipp Maier9459ebd2020-09-29 23:31:33 +0200897DEFUN_ATTR(cfg_pcu_no_cs_downgrade_thrsh,
898 cfg_pcu_no_cs_downgrade_thrsh_cmd,
899 "no cs downgrade-threshold",
900 NO_STR CS_STR CS_DOWNGRADE_STR,
901 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +0200902{
Pau Espin Pedrolad79b852021-01-14 13:20:55 +0100903 the_pcu->vty.cs_downgrade_threshold = 0;
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +0200904 return CMD_SUCCESS;
905}
906
Philipp Maier9459ebd2020-09-29 23:31:33 +0200907DEFUN_ATTR(cfg_pcu_cs_lqual_ranges,
908 cfg_pcu_cs_lqual_ranges_cmd,
909 "cs link-quality-ranges cs1 <0-35> cs2 <0-35> <0-35> cs3 <0-35> <0-35> cs4 <0-35>",
910 CS_STR "Set link quality ranges for each uplink CS\n"
911 "Set quality range for CS-1 (high value only)\n"
912 "CS-1 high (dB)\n"
913 "Set quality range for CS-2\n"
914 "CS-2 low (dB)\n"
915 "CS-2 high (dB)\n"
916 "Set quality range for CS-3\n"
917 "CS-3 low (dB)\n"
918 "CS-3 high (dB)\n"
919 "Set quality range for CS-4 (low value only)\n"
920 "CS-4 low (dB)\n",
921 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck94cde132015-06-09 09:44:36 +0200922{
Jacob Erlbeck94cde132015-06-09 09:44:36 +0200923 uint8_t cs1_high = atoi(argv[0]);
924 uint8_t cs2_low = atoi(argv[1]);
925 uint8_t cs2_high = atoi(argv[2]);
926 uint8_t cs3_low = atoi(argv[3]);
927 uint8_t cs3_high = atoi(argv[4]);
928 uint8_t cs4_low = atoi(argv[5]);
929
Pau Espin Pedrol54b159a2021-01-14 13:30:04 +0100930 the_pcu->vty.cs_lqual_ranges[0].high = cs1_high;
931 the_pcu->vty.cs_lqual_ranges[1].low = cs2_low;
932 the_pcu->vty.cs_lqual_ranges[1].high = cs2_high;
933 the_pcu->vty.cs_lqual_ranges[2].low = cs3_low;
934 the_pcu->vty.cs_lqual_ranges[2].high = cs3_high;
935 the_pcu->vty.cs_lqual_ranges[3].low = cs4_low;
Jacob Erlbeck94cde132015-06-09 09:44:36 +0200936
937 return CMD_SUCCESS;
938}
939
Philipp Maier9459ebd2020-09-29 23:31:33 +0200940DEFUN_ATTR(cfg_pcu_mcs_lqual_ranges,
941 cfg_pcu_mcs_lqual_ranges_cmd,
942 "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>",
943 CS_STR "Set link quality ranges for each uplink MCS\n"
944 "Set quality range for MCS-1 (high value only)\n"
945 "MCS-1 high (dB)\n"
946 "Set quality range for MCS-2\n"
947 "MCS-2 high (dB)\n"
948 "MCS-2 low (dB)\n"
949 "Set quality range for MCS-3\n"
950 "MCS-3 high (dB)\n"
951 "MCS-3 low (dB)\n"
952 "Set quality range for MCS-4\n"
953 "MCS-4 high (dB)\n"
954 "MCS-4 low (dB)\n"
955 "Set quality range for MCS-5\n"
956 "MCS-5 high (dB)\n"
957 "MCS-5 low (dB)\n"
958 "Set quality range for MCS-6\n"
959 "MCS-6 low (dB)\n"
960 "MCS-6 high (dB)\n"
961 "Set quality range for MCS-7\n"
962 "MCS-7 low (dB)\n"
963 "MCS-7 high (dB)\n"
964 "Set quality range for MCS-8\n"
965 "MCS-8 low (dB)\n"
966 "MCS-8 high (dB)\n"
967 "Set quality range for MCS-9 (low value only)\n"
968 "MCS-9 low (dB)\n",
969 CMD_ATTR_IMMEDIATE)
Minh-Quang Nguyen1f189092017-08-16 09:50:06 -0400970{
Pau Espin Pedrol54b159a2021-01-14 13:30:04 +0100971 the_pcu->vty.mcs_lqual_ranges[0].high = atoi(argv[0]);
972 the_pcu->vty.mcs_lqual_ranges[1].low = atoi(argv[1]);
973 the_pcu->vty.mcs_lqual_ranges[1].high = atoi(argv[2]);
974 the_pcu->vty.mcs_lqual_ranges[2].low = atoi(argv[3]);
975 the_pcu->vty.mcs_lqual_ranges[2].high = atoi(argv[4]);
976 the_pcu->vty.mcs_lqual_ranges[3].low = atoi(argv[5]);
977 the_pcu->vty.mcs_lqual_ranges[3].high = atoi(argv[6]);
978 the_pcu->vty.mcs_lqual_ranges[4].low = atoi(argv[7]);
979 the_pcu->vty.mcs_lqual_ranges[4].high = atoi(argv[8]);
980 the_pcu->vty.mcs_lqual_ranges[5].low = atoi(argv[9]);
981 the_pcu->vty.mcs_lqual_ranges[5].high = atoi(argv[10]);
982 the_pcu->vty.mcs_lqual_ranges[6].low = atoi(argv[11]);
983 the_pcu->vty.mcs_lqual_ranges[6].high = atoi(argv[12]);
984 the_pcu->vty.mcs_lqual_ranges[7].low = atoi(argv[13]);
985 the_pcu->vty.mcs_lqual_ranges[7].high = atoi(argv[14]);
986 the_pcu->vty.mcs_lqual_ranges[8].low = atoi(argv[15]);
Minh-Quang Nguyen1f189092017-08-16 09:50:06 -0400987
988 return CMD_SUCCESS;
989}
990
Pau Espin Pedrolc4178e52017-08-08 15:03:50 +0200991DEFUN(cfg_pcu_sock,
992 cfg_pcu_sock_cmd,
993 "pcu-socket PATH",
994 "Configure the osmo-bts PCU socket file/path name\n"
995 "Path of the socket to connect to\n")
996{
Vadim Yanitskiyfc75cc02019-11-30 20:13:25 +0700997 if (vty->type != VTY_FILE)
998 vty_out(vty, "Changing PCU socket path at run-time has no effect%s", VTY_NEWLINE);
999
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +01001000 osmo_talloc_replace_string(tall_pcu_ctx, &the_pcu->pcu_sock_path, argv[0]);
Pau Espin Pedrolc4178e52017-08-08 15:03:50 +02001001
1002 return CMD_SUCCESS;
1003}
Jacob Erlbeck94cde132015-06-09 09:44:36 +02001004
Philipp Maier9459ebd2020-09-29 23:31:33 +02001005DEFUN_USRATTR(cfg_pcu_gb_dialect,
1006 cfg_pcu_gb_dialect_cmd,
1007 X(PCU_VTY_ATTR_NS_RESET),
1008 "gb-dialect (classic|ip-sns)",
1009 "Select which Gb interface dialect to use\n"
1010 "Classic Gb interface with NS-{RESET,BLOCK,UNBLOCK} and static configuration\n"
1011 "Modern Gb interface with IP-SNS (Sub Network Service) and dynamic configuration\n")
Harald Welte57d35152018-07-05 03:11:17 +02001012{
Alexander Couzens290d9032020-09-16 21:52:02 +02001013 if (!strcmp(argv[0], "ip-sns")) {
Alexander Couzensf7ec5252021-01-25 20:28:38 +01001014 the_pcu->vty.ns_dialect = GPRS_NS2_DIALECT_SNS;
Alexander Couzens290d9032020-09-16 21:52:02 +02001015 } else {
Alexander Couzensf7ec5252021-01-25 20:28:38 +01001016 the_pcu->vty.ns_dialect = GPRS_NS2_DIALECT_IPACCESS;
Alexander Couzens290d9032020-09-16 21:52:02 +02001017 }
Harald Welte57d35152018-07-05 03:11:17 +02001018
1019 return CMD_SUCCESS;
1020}
1021
Pau Espin Pedrolc0a250d2021-01-21 18:46:13 +01001022DEFUN(cfg_neighbor_resolution, cfg_neighbor_resolution_cmd,
1023 "neighbor resolution " VTY_IPV46_CMD " [<0-65535>]",
1024 "Manage local and remote-BSS neighbor cells\n"
1025 "Connect to Neighbor Resolution Service (CTRL interface) to given ip and port\n"
1026 "IPv4 address to connect to\n" "IPv6 address to connect to\n"
1027 "Port to connect to (default 4248)\n")
1028{
1029 osmo_talloc_replace_string(the_pcu, &the_pcu->vty.neigh_ctrl_addr, argv[0]);
1030 if (argc > 1)
1031 the_pcu->vty.neigh_ctrl_port = atoi(argv[1]);
1032 else
1033 the_pcu->vty.neigh_ctrl_port = OSMO_CTRL_PORT_BSC_NEIGH;
1034 return CMD_SUCCESS;
1035}
1036
1037
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +02001038DEFUN(show_bts_timer, show_bts_timer_cmd,
1039 "show bts-timer " OSMO_TDEF_VTY_ARG_T_OPTIONAL,
1040 SHOW_STR "Show BTS controlled timers\n"
1041 OSMO_TDEF_VTY_DOC_T)
1042{
Pau Espin Pedrold1049dc2021-01-18 17:14:14 +01001043 struct gprs_rlcmac_bts *bts;
1044 llist_for_each_entry(bts, &the_pcu->bts_list, list) {
1045 const char *T_arg = argc > 0 ? argv[0] : NULL;
1046 vty_out(vty, "BTS%" PRIu8 ":%s", bts->nr, VTY_NEWLINE);
1047 osmo_tdef_vty_show_cmd(vty, bts->T_defs_bts, T_arg, " ");
1048 }
1049 return CMD_SUCCESS;
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +02001050}
1051
1052DEFUN(show_timer, show_timer_cmd,
1053 "show timer " OSMO_TDEF_VTY_ARG_T_OPTIONAL,
1054 SHOW_STR "Show PCU timers\n"
1055 OSMO_TDEF_VTY_DOC_T)
1056{
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +02001057 const char *T_arg = argc > 0 ? argv[0] : NULL;
Pau Espin Pedrol924aaad2021-01-14 12:01:42 +01001058 return osmo_tdef_vty_show_cmd(vty, the_pcu->T_defs, T_arg, NULL);
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +02001059}
1060
Philipp Maier9459ebd2020-09-29 23:31:33 +02001061DEFUN_ATTR(cfg_pcu_timer, cfg_pcu_timer_cmd,
1062 "timer " OSMO_TDEF_VTY_ARG_SET_OPTIONAL,
1063 "Configure or show PCU timers\n"
1064 OSMO_TDEF_VTY_DOC_SET,
1065 CMD_ATTR_IMMEDIATE)
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +02001066{
Pau Espin Pedrolab7159f2021-01-26 17:51:44 +01001067 int rc;
1068 struct osmo_tdef *t;
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +02001069 /* If any arguments are missing, redirect to 'show' */
1070 if (argc < 2)
1071 return show_timer(self, vty, argc, argv);
Pau Espin Pedrolab7159f2021-01-26 17:51:44 +01001072 if ((rc = osmo_tdef_vty_set_cmd(vty, the_pcu->T_defs, argv)) != CMD_SUCCESS)
1073 return rc;
1074 t = osmo_tdef_vty_parse_T_arg(vty, the_pcu->T_defs, argv[0]);
1075 switch (t->T) {
1076 case PCU_TDEF_NEIGH_CACHE_ALIVE:
1077 neigh_cache_set_keep_time_interval(the_pcu->neigh_cache, t->val);
1078 break;
1079 case PCU_TDEF_SI_CACHE_ALIVE:
1080 si_cache_set_keep_time_interval(the_pcu->si_cache, t->val);
1081 break;
1082 default:
1083 break;
1084 }
1085 return CMD_SUCCESS;
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +02001086}
1087
Daniel Willmann772415f2014-01-15 17:06:51 +01001088DEFUN(show_tbf,
1089 show_tbf_cmd,
Max12a09872018-02-01 16:07:33 +01001090 "show tbf (all|ccch|pacch)",
1091 SHOW_STR "information about TBFs\n"
1092 "All TBFs\n"
1093 "TBFs allocated via CCCH\n"
1094 "TBFs allocated via PACCH\n")
Daniel Willmann772415f2014-01-15 17:06:51 +01001095{
Pau Espin Pedrold1049dc2021-01-18 17:14:14 +01001096 struct gprs_rlcmac_bts *bts;
1097 llist_for_each_entry(bts, &the_pcu->bts_list, list) {
1098 uint32_t flags = UINT32_MAX;
Max12a09872018-02-01 16:07:33 +01001099
Pau Espin Pedrold1049dc2021-01-18 17:14:14 +01001100 if (argv[0][0] == 'c')
1101 flags = (1 << GPRS_RLCMAC_FLAG_CCCH);
1102 else if (argv[0][0] == 'p')
1103 flags = (1 << GPRS_RLCMAC_FLAG_PACCH);
Max12a09872018-02-01 16:07:33 +01001104
Pau Espin Pedrold1049dc2021-01-18 17:14:14 +01001105 pcu_vty_show_tbf_all(vty, bts, flags);
1106 }
1107 return CMD_SUCCESS;
Daniel Willmann772415f2014-01-15 17:06:51 +01001108}
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +01001109
Jacob Erlbeckf47f68a2015-06-04 10:23:24 +02001110DEFUN(show_ms_all,
1111 show_ms_all_cmd,
1112 "show ms all",
1113 SHOW_STR "information about MSs\n" "All TBFs\n")
1114{
Pau Espin Pedrold1049dc2021-01-18 17:14:14 +01001115 struct gprs_rlcmac_bts *bts;
1116 llist_for_each_entry(bts, &the_pcu->bts_list, list) {
1117 pcu_vty_show_ms_all(vty, bts);
1118 }
1119 return CMD_SUCCESS;
Jacob Erlbeckf47f68a2015-06-04 10:23:24 +02001120}
1121
Jacob Erlbeck37e896d2015-06-05 16:33:33 +02001122DEFUN(show_ms_tlli,
1123 show_ms_tlli_cmd,
1124 "show ms tlli TLLI",
1125 SHOW_STR "information about MSs\n" "Select MS by TLLI\n" "TLLI as hex\n")
1126{
Pau Espin Pedrold1049dc2021-01-18 17:14:14 +01001127 struct gprs_rlcmac_bts *bts;
1128 llist_for_each_entry(bts, &the_pcu->bts_list, list) {
1129 char *endp = NULL;
1130 unsigned long long tlli = strtoll(argv[0], &endp, 16);
1131 if ((endp != NULL && *endp != 0) || tlli > 0xffffffffULL) {
1132 vty_out(vty, "Invalid TLLI.%s", VTY_NEWLINE);
1133 return CMD_WARNING;
1134 }
1135 pcu_vty_show_ms_by_tlli(vty, bts, (uint32_t)tlli);
Jacob Erlbeck37e896d2015-06-05 16:33:33 +02001136 }
Pau Espin Pedrold1049dc2021-01-18 17:14:14 +01001137 return CMD_SUCCESS;
Jacob Erlbeck37e896d2015-06-05 16:33:33 +02001138}
1139
1140DEFUN(show_ms_imsi,
1141 show_ms_imsi_cmd,
1142 "show ms imsi IMSI",
1143 SHOW_STR "information about MSs\n" "Select MS by IMSI\n" "IMSI\n")
1144{
Pau Espin Pedrold1049dc2021-01-18 17:14:14 +01001145 struct gprs_rlcmac_bts *bts;
1146 llist_for_each_entry(bts, &the_pcu->bts_list, list) {
1147 pcu_vty_show_ms_by_imsi(vty, bts, argv[0]);
1148 }
1149 return CMD_SUCCESS;
Jacob Erlbeck37e896d2015-06-05 16:33:33 +02001150}
1151
Andreas Eversberg12942562012-07-12 14:31:57 +02001152static const char pcu_copyright[] =
Harald Welted1e340f2013-01-17 12:24:29 +01001153 "Copyright (C) 2012 by Ivan Kluchnikov <kluchnikovi@gmail.com> and \r\n"
1154 " Andreas Eversberg <jolly@eversberg.eu>\r\n"
Andreas Eversberg12942562012-07-12 14:31:57 +02001155 "License GNU GPL version 2 or later\r\n"
1156 "This is free software: you are free to change and redistribute it.\r\n"
1157 "There is NO WARRANTY, to the extent permitted by law.\r\n";
1158
1159struct vty_app_info pcu_vty_info = {
Pau Espin Pedrold0fc9e82019-11-29 13:37:45 +01001160 .name = "OsmoPCU",
Andreas Eversberg12942562012-07-12 14:31:57 +02001161 .version = PACKAGE_VERSION,
1162 .copyright = pcu_copyright,
Philipp Maier9459ebd2020-09-29 23:31:33 +02001163 .usr_attr_desc = {
1164 [PCU_VTY_ATTR_NEW_TBF] = \
1165 "This command applies when a new TBF is begins",
1166 [PCU_VTY_ATTR_NEW_SUBSCR] = \
1167 "This command applies when a new subscriber attaches",
1168 [PCU_VTY_ATTR_NS_RESET] = \
1169 "This command applies when the NS is reset",
1170 },
1171 .usr_attr_letters = {
1172 [PCU_VTY_ATTR_NEW_TBF] = 'n',
1173 [PCU_VTY_ATTR_NEW_SUBSCR] = 's',
1174 [PCU_VTY_ATTR_NS_RESET] = 'r',
1175 },
Andreas Eversberg12942562012-07-12 14:31:57 +02001176};
1177
Pau Espin Pedrolcd2ac562019-08-05 14:30:44 +02001178int pcu_vty_init(void)
Andreas Eversberg12942562012-07-12 14:31:57 +02001179{
1180// install_element_ve(&show_pcu_cmd);
1181
Harald Welte717cdf52017-07-21 21:56:23 +02001182 cfg_pcu_gsmtap_categ_cmd.string = vty_cmd_string_from_valstr(tall_pcu_ctx, pcu_gsmtap_categ_names,
1183 "gsmtap-category (",
1184 "|",")", VTY_DO_LOWER);
1185 cfg_pcu_gsmtap_categ_cmd.doc = vty_cmd_string_from_valstr(tall_pcu_ctx, pcu_gsmtap_categ_help,
1186 "GSMTAP Category\n",
1187 "\n", "", 0);
1188 cfg_pcu_no_gsmtap_categ_cmd.string = vty_cmd_string_from_valstr(tall_pcu_ctx, pcu_gsmtap_categ_names,
1189 "no gsmtap-category (",
1190 "|",")", VTY_DO_LOWER);
1191 cfg_pcu_no_gsmtap_categ_cmd.doc = vty_cmd_string_from_valstr(tall_pcu_ctx, pcu_gsmtap_categ_help,
1192 NO_STR "GSMTAP Category\n",
1193 "\n", "", 0);
1194
Pau Espin Pedrolcd2ac562019-08-05 14:30:44 +02001195 logging_vty_add_cmds();
1196 osmo_stats_vty_add_cmds();
Vadim Yanitskiyd83c8ff2020-02-06 16:46:17 +07001197 osmo_talloc_vty_add_cmds();
Vadim Yanitskiy830ca262021-02-05 23:22:37 +01001198 osmo_fsm_vty_add_cmds();
Andreas Eversberg12942562012-07-12 14:31:57 +02001199
Andreas Eversberg8b761a32012-07-20 21:50:31 +02001200 install_node(&pcu_node, config_write_pcu);
1201 install_element(CONFIG_NODE, &cfg_pcu_cmd);
Jacob Erlbeck953c7892015-09-28 18:12:57 +02001202 install_element(PCU_NODE, &cfg_pcu_egprs_cmd);
1203 install_element(PCU_NODE, &cfg_pcu_no_egprs_cmd);
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +02001204 install_element(PCU_NODE, &cfg_pcu_no_two_phase_cmd);
Andreas Eversberg8b761a32012-07-20 21:50:31 +02001205 install_element(PCU_NODE, &cfg_pcu_cs_cmd);
1206 install_element(PCU_NODE, &cfg_pcu_no_cs_cmd);
Jacob Erlbeckb33e6752015-06-04 19:04:30 +02001207 install_element(PCU_NODE, &cfg_pcu_cs_max_cmd);
1208 install_element(PCU_NODE, &cfg_pcu_no_cs_max_cmd);
Jacob Erlbeck8322d082015-06-04 15:12:10 +02001209 install_element(PCU_NODE, &cfg_pcu_cs_err_limits_cmd);
1210 install_element(PCU_NODE, &cfg_pcu_no_cs_err_limits_cmd);
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +02001211 install_element(PCU_NODE, &cfg_pcu_cs_downgrade_thrsh_cmd);
1212 install_element(PCU_NODE, &cfg_pcu_no_cs_downgrade_thrsh_cmd);
Jacob Erlbeck94cde132015-06-09 09:44:36 +02001213 install_element(PCU_NODE, &cfg_pcu_cs_lqual_ranges_cmd);
Minh-Quang Nguyen1f189092017-08-16 09:50:06 -04001214 install_element(PCU_NODE, &cfg_pcu_mcs_lqual_ranges_cmd);
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +01001215 install_element(PCU_NODE, &cfg_pcu_mcs_cmd);
Aravind Sirsikar50b09702016-08-22 17:21:10 +05301216 install_element(PCU_NODE, &cfg_pcu_dl_arq_cmd);
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +01001217 install_element(PCU_NODE, &cfg_pcu_no_mcs_cmd);
Jacob Erlbeck0d058052016-01-07 11:48:28 +01001218 install_element(PCU_NODE, &cfg_pcu_mcs_max_cmd);
1219 install_element(PCU_NODE, &cfg_pcu_no_mcs_max_cmd);
Jacob Erlbeck36df7742016-01-19 15:53:30 +01001220 install_element(PCU_NODE, &cfg_pcu_window_size_cmd);
Andreas Eversberg24131bf2012-07-21 11:09:58 +02001221 install_element(PCU_NODE, &cfg_pcu_queue_lifetime_cmd);
1222 install_element(PCU_NODE, &cfg_pcu_queue_lifetime_inf_cmd);
1223 install_element(PCU_NODE, &cfg_pcu_no_queue_lifetime_cmd);
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +01001224 install_element(PCU_NODE, &cfg_pcu_queue_hysteresis_cmd);
1225 install_element(PCU_NODE, &cfg_pcu_no_queue_hysteresis_cmd);
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +02001226 install_element(PCU_NODE, &cfg_pcu_queue_codel_cmd);
1227 install_element(PCU_NODE, &cfg_pcu_queue_codel_interval_cmd);
1228 install_element(PCU_NODE, &cfg_pcu_no_queue_codel_cmd);
Jacob Erlbeckd0261b72015-04-02 13:58:09 +02001229 install_element(PCU_NODE, &cfg_pcu_queue_idle_ack_delay_cmd);
1230 install_element(PCU_NODE, &cfg_pcu_no_queue_idle_ack_delay_cmd);
Andreas Eversberga1503fa2012-07-22 08:58:09 +02001231 install_element(PCU_NODE, &cfg_pcu_alloc_cmd);
Andreas Eversberg07e97cf2012-08-07 16:00:56 +02001232 install_element(PCU_NODE, &cfg_pcu_two_phase_cmd);
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +02001233 install_element(PCU_NODE, &cfg_pcu_fc_interval_cmd);
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +02001234 install_element(PCU_NODE, &cfg_pcu_fc_bucket_time_cmd);
1235 install_element(PCU_NODE, &cfg_pcu_no_fc_bucket_time_cmd);
Jacob Erlbeck87d73412015-04-21 12:56:48 +02001236 install_element(PCU_NODE, &cfg_pcu_fc_bvc_bucket_size_cmd);
1237 install_element(PCU_NODE, &cfg_pcu_no_fc_bvc_bucket_size_cmd);
1238 install_element(PCU_NODE, &cfg_pcu_fc_bvc_leak_rate_cmd);
1239 install_element(PCU_NODE, &cfg_pcu_no_fc_bvc_leak_rate_cmd);
1240 install_element(PCU_NODE, &cfg_pcu_fc_ms_bucket_size_cmd);
1241 install_element(PCU_NODE, &cfg_pcu_no_fc_ms_bucket_size_cmd);
1242 install_element(PCU_NODE, &cfg_pcu_fc_ms_leak_rate_cmd);
1243 install_element(PCU_NODE, &cfg_pcu_no_fc_ms_leak_rate_cmd);
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +02001244 install_element(PCU_NODE, &cfg_pcu_alpha_cmd);
1245 install_element(PCU_NODE, &cfg_pcu_gamma_cmd);
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +01001246 install_element(PCU_NODE, &cfg_pcu_dl_tbf_idle_time_cmd);
1247 install_element(PCU_NODE, &cfg_pcu_no_dl_tbf_idle_time_cmd);
Oliver Smith45fdc442019-09-05 15:12:20 +02001248 install_element(PCU_NODE, &cfg_pcu_dl_tbf_preemptive_retransmission_cmd);
1249 install_element(PCU_NODE, &cfg_pcu_no_dl_tbf_preemptive_retransmission_cmd);
Jacob Erlbecka098c192015-05-28 16:11:19 +02001250 install_element(PCU_NODE, &cfg_pcu_ms_idle_time_cmd);
1251 install_element(PCU_NODE, &cfg_pcu_no_ms_idle_time_cmd);
Harald Welte717cdf52017-07-21 21:56:23 +02001252 install_element(PCU_NODE, &cfg_pcu_gsmtap_categ_cmd);
1253 install_element(PCU_NODE, &cfg_pcu_no_gsmtap_categ_cmd);
Pau Espin Pedrolc4178e52017-08-08 15:03:50 +02001254 install_element(PCU_NODE, &cfg_pcu_sock_cmd);
Harald Welte57d35152018-07-05 03:11:17 +02001255 install_element(PCU_NODE, &cfg_pcu_gb_dialect_cmd);
Pau Espin Pedrolc0a250d2021-01-21 18:46:13 +01001256 install_element(PCU_NODE, &cfg_neighbor_resolution_cmd);
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +02001257 install_element(PCU_NODE, &cfg_pcu_timer_cmd);
Andreas Eversberg8b761a32012-07-20 21:50:31 +02001258
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +01001259 install_element_ve(&show_bts_stats_cmd);
Pau Espin Pedrola1ac2f02020-09-22 17:01:31 +02001260 install_element_ve(&show_bts_pdch_cmd);
Daniel Willmann772415f2014-01-15 17:06:51 +01001261 install_element_ve(&show_tbf_cmd);
Jacob Erlbeckf47f68a2015-06-04 10:23:24 +02001262 install_element_ve(&show_ms_all_cmd);
Jacob Erlbeck37e896d2015-06-05 16:33:33 +02001263 install_element_ve(&show_ms_tlli_cmd);
1264 install_element_ve(&show_ms_imsi_cmd);
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +02001265 install_element_ve(&show_bts_timer_cmd);
1266 install_element_ve(&show_timer_cmd);
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +01001267
Andreas Eversberg12942562012-07-12 14:31:57 +02001268 return 0;
1269}