blob: c2de92c656a05d062a27755f7e281b825284d140 [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 Pedrolfe8de452021-02-09 18:47:34 +0100233 if (the_pcu->vty.force_alpha != (uint8_t)-1)
234 vty_out(vty, " alpha %u%s", the_pcu->vty.force_alpha, VTY_NEWLINE);
Pau Espin Pedrola2814952021-01-14 12:53:53 +0100235 vty_out(vty, " gamma %d%s", the_pcu->vty.gamma * 2, VTY_NEWLINE);
Pau Espin Pedrol05f9f592021-01-14 12:56:58 +0100236 if (!the_pcu->vty.dl_tbf_preemptive_retransmission)
Oliver Smith45fdc442019-09-05 15:12:20 +0200237 vty_out(vty, " no dl-tbf-preemptive-retransmission%s", VTY_NEWLINE);
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100238 if (strcmp(the_pcu->pcu_sock_path, PCU_SOCK_DEFAULT))
239 vty_out(vty, " pcu-socket %s%s", the_pcu->pcu_sock_path, VTY_NEWLINE);
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200240
Harald Welte717cdf52017-07-21 21:56:23 +0200241 for (i = 0; i < 32; i++) {
242 unsigned int cs = (1 << i);
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100243 if (the_pcu->gsmtap_categ_mask & cs) {
Harald Welte717cdf52017-07-21 21:56:23 +0200244 vty_out(vty, " gsmtap-category %s%s",
245 get_value_string(pcu_gsmtap_categ_names, i), VTY_NEWLINE);
246 }
247 }
248
Alexander Couzensf7ec5252021-01-25 20:28:38 +0100249 if (the_pcu->vty.ns_dialect == GPRS_NS2_DIALECT_SNS)
Harald Welte57d35152018-07-05 03:11:17 +0200250 vty_out(vty, " gb-dialect ip-sns%s", VTY_NEWLINE);
251 else
252 vty_out(vty, " gb-dialect classic%s", VTY_NEWLINE);
253
Pau Espin Pedrol66e8a492021-02-17 20:24:59 +0100254 if (the_pcu->vty.neigh_ctrl_addr) {
255 vty_out(vty, " neighbor resolution %s %u%s",
256 the_pcu->vty.neigh_ctrl_addr, the_pcu->vty.neigh_ctrl_port, VTY_NEWLINE);
257 }
258
Pau Espin Pedrol924aaad2021-01-14 12:01:42 +0100259 osmo_tdef_vty_write(vty, the_pcu->T_defs, " timer ");
Pau Espin Pedrol18794422019-09-26 18:25:35 +0200260
Maxc9ce6f92018-01-30 17:53:02 +0100261 return CMD_SUCCESS;
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200262}
263
264/* per-BTS configuration */
Philipp Maier9459ebd2020-09-29 23:31:33 +0200265DEFUN_ATTR(cfg_pcu,
266 cfg_pcu_cmd,
267 "pcu",
268 "BTS specific configure",
269 CMD_ATTR_IMMEDIATE)
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200270{
271 vty->node = PCU_NODE;
272
273 return CMD_SUCCESS;
274}
275
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200276#define EGPRS_STR "EGPRS configuration\n"
277
Pau Espin Pedrol270c9ea2020-10-30 17:15:32 +0100278DEFUN_DEPRECATED(cfg_pcu_egprs,
279 cfg_pcu_egprs_cmd,
280 "egprs only",
281 EGPRS_STR "Use EGPRS and disable plain GPRS\n")
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200282{
Pau Espin Pedrol270c9ea2020-10-30 17:15:32 +0100283 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 +0200284 return CMD_SUCCESS;
285}
286
Pau Espin Pedrol270c9ea2020-10-30 17:15:32 +0100287DEFUN_DEPRECATED(cfg_pcu_no_egprs,
288 cfg_pcu_no_egprs_cmd,
289 "no egprs",
290 NO_STR EGPRS_STR)
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200291{
Pau Espin Pedrol270c9ea2020-10-30 17:15:32 +0100292 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 +0200293 return CMD_SUCCESS;
294}
295
Philipp Maier9459ebd2020-09-29 23:31:33 +0200296DEFUN_ATTR(cfg_pcu_fc_interval,
297 cfg_pcu_fc_interval_cmd,
298 "flow-control-interval <1-10>",
299 "Interval between sending subsequent Flow Control PDUs\n"
300 "Interval time in seconds\n",
301 CMD_ATTR_IMMEDIATE)
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200302{
Pau Espin Pedrole8912222021-01-14 14:03:17 +0100303 the_pcu->vty.fc_interval = atoi(argv[0]);
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200304 return CMD_SUCCESS;
305}
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200306#define FC_STR "BSSGP Flow Control configuration\n"
307#define FC_BMAX_STR(who) "Force a fixed value for the " who " bucket size\n"
308#define FC_LR_STR(who) "Force a fixed value for the " who " leak rate\n"
309
Philipp Maier9459ebd2020-09-29 23:31:33 +0200310DEFUN_ATTR(cfg_pcu_fc_bvc_bucket_size,
311 cfg_pcu_fc_bvc_bucket_size_cmd,
312 "flow-control force-bvc-bucket-size <1-6553500>",
313 FC_STR FC_BMAX_STR("BVC") "Bucket size in octets\n",
314 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200315{
Pau Espin Pedrole8912222021-01-14 14:03:17 +0100316 the_pcu->vty.fc_bvc_bucket_size = atoi(argv[0]);
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200317 return CMD_SUCCESS;
318}
319
Philipp Maier9459ebd2020-09-29 23:31:33 +0200320DEFUN_ATTR(cfg_pcu_no_fc_bvc_bucket_size,
321 cfg_pcu_no_fc_bvc_bucket_size_cmd,
322 "no flow-control force-bvc-bucket-size",
323 NO_STR FC_STR FC_BMAX_STR("BVC"),
324 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200325{
Pau Espin Pedrole8912222021-01-14 14:03:17 +0100326 the_pcu->vty.fc_bvc_bucket_size = 0;
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200327 return CMD_SUCCESS;
328}
329
Philipp Maier9459ebd2020-09-29 23:31:33 +0200330DEFUN_ATTR(cfg_pcu_fc_bvc_leak_rate,
331 cfg_pcu_fc_bvc_leak_rate_cmd,
332 "flow-control force-bvc-leak-rate <1-6553500>",
333 FC_STR FC_LR_STR("BVC") "Leak rate in bit/s\n",
334 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200335{
Pau Espin Pedrole8912222021-01-14 14:03:17 +0100336 the_pcu->vty.fc_bvc_leak_rate = atoi(argv[0]);
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200337
338 return CMD_SUCCESS;
339}
340
Philipp Maier9459ebd2020-09-29 23:31:33 +0200341DEFUN_ATTR(cfg_pcu_no_fc_bvc_leak_rate,
342 cfg_pcu_no_fc_bvc_leak_rate_cmd,
343 "no flow-control force-bvc-leak-rate",
344 NO_STR FC_STR FC_LR_STR("BVC"),
345 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200346{
Pau Espin Pedrole8912222021-01-14 14:03:17 +0100347 the_pcu->vty.fc_bvc_leak_rate = 0;
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200348 return CMD_SUCCESS;
349}
350
Philipp Maier9459ebd2020-09-29 23:31:33 +0200351DEFUN_ATTR(cfg_pcu_fc_ms_bucket_size,
352 cfg_pcu_fc_ms_bucket_size_cmd,
353 "flow-control force-ms-bucket-size <1-6553500>",
354 FC_STR FC_BMAX_STR("default MS") "Bucket size in octets\n",
355 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200356{
Pau Espin Pedrole8912222021-01-14 14:03:17 +0100357 the_pcu->vty.fc_ms_bucket_size = atoi(argv[0]);
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200358 return CMD_SUCCESS;
359}
360
Philipp Maier9459ebd2020-09-29 23:31:33 +0200361DEFUN_ATTR(cfg_pcu_no_fc_ms_bucket_size,
362 cfg_pcu_no_fc_ms_bucket_size_cmd,
363 "no flow-control force-ms-bucket-size",
364 NO_STR FC_STR FC_BMAX_STR("default MS"),
365 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200366{
Pau Espin Pedrole8912222021-01-14 14:03:17 +0100367 the_pcu->vty.fc_ms_bucket_size = 0;
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200368 return CMD_SUCCESS;
369}
370
Philipp Maier9459ebd2020-09-29 23:31:33 +0200371DEFUN_ATTR(cfg_pcu_fc_ms_leak_rate,
372 cfg_pcu_fc_ms_leak_rate_cmd,
373 "flow-control force-ms-leak-rate <1-6553500>",
374 FC_STR FC_LR_STR("default MS") "Leak rate in bit/s\n",
375 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200376{
Pau Espin Pedrole8912222021-01-14 14:03:17 +0100377 the_pcu->vty.fc_ms_leak_rate = atoi(argv[0]);
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200378 return CMD_SUCCESS;
379}
380
Philipp Maier9459ebd2020-09-29 23:31:33 +0200381DEFUN_ATTR(cfg_pcu_no_fc_ms_leak_rate,
382 cfg_pcu_no_fc_ms_leak_rate_cmd,
383 "no flow-control force-ms-leak-rate",
384 NO_STR FC_STR FC_LR_STR("default MS"),
385 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200386{
Pau Espin Pedrole8912222021-01-14 14:03:17 +0100387 the_pcu->vty.fc_ms_leak_rate = 0;
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200388 return CMD_SUCCESS;
389}
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200390
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200391#define FC_BTIME_STR "Set target downlink maximum queueing time (only affects the advertised bucket size)\n"
Philipp Maier9459ebd2020-09-29 23:31:33 +0200392DEFUN_ATTR(cfg_pcu_fc_bucket_time,
393 cfg_pcu_fc_bucket_time_cmd,
394 "flow-control bucket-time <1-65534>",
395 FC_STR FC_BTIME_STR "Time in centi-seconds\n",
396 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200397{
Pau Espin Pedrole8912222021-01-14 14:03:17 +0100398 the_pcu->vty.fc_bucket_time = atoi(argv[0]);
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200399 return CMD_SUCCESS;
400}
401
Philipp Maier9459ebd2020-09-29 23:31:33 +0200402DEFUN_ATTR(cfg_pcu_no_fc_bucket_time,
403 cfg_pcu_no_fc_bucket_time_cmd,
404 "no flow-control bucket-time",
405 NO_STR FC_STR FC_BTIME_STR,
406 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200407{
Pau Espin Pedrole8912222021-01-14 14:03:17 +0100408 the_pcu->vty.fc_bucket_time = 0;
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200409 return CMD_SUCCESS;
410}
411
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200412#define CS_STR "Coding Scheme configuration\n"
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200413
Philipp Maier9459ebd2020-09-29 23:31:33 +0200414DEFUN_ATTR(cfg_pcu_cs,
415 cfg_pcu_cs_cmd,
416 "cs <1-4> [<1-4>]",
417 CS_STR
418 "Initial CS value to be used (overrides BTS config)\n"
419 "Use a different initial CS value for the uplink",
420 CMD_ATTR_IMMEDIATE)
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200421{
Pau Espin Pedrol793583e2021-01-14 16:20:57 +0100422 uint8_t cs_dl, cs_ul;
423 cs_dl = atoi(argv[0]);
Andreas Eversberg499ff412012-10-03 14:21:36 +0200424 if (argc > 1)
Pau Espin Pedrol793583e2021-01-14 16:20:57 +0100425 cs_ul = atoi(argv[1]);
Andreas Eversberg499ff412012-10-03 14:21:36 +0200426 else
Pau Espin Pedrol793583e2021-01-14 16:20:57 +0100427 cs_ul = cs_dl;
428 the_pcu->vty.force_initial_cs = true;
429 gprs_pcu_set_initial_cs(the_pcu, cs_dl, cs_ul);
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200430 return CMD_SUCCESS;
431}
432
Philipp Maier9459ebd2020-09-29 23:31:33 +0200433DEFUN_ATTR(cfg_pcu_no_cs,
434 cfg_pcu_no_cs_cmd,
435 "no cs",
436 NO_STR CS_STR,
437 CMD_ATTR_IMMEDIATE)
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200438{
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100439 the_pcu->vty.force_initial_cs = false;
Pau Espin Pedrol793583e2021-01-14 16:20:57 +0100440 gprs_pcu_set_initial_cs(the_pcu, 0, 0);
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200441 return CMD_SUCCESS;
442}
443
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100444#define CS_MAX_STR "Set maximum values for adaptive CS selection (overrides BTS config)\n"
Philipp Maier9459ebd2020-09-29 23:31:33 +0200445DEFUN_ATTR(cfg_pcu_cs_max,
446 cfg_pcu_cs_max_cmd,
447 "cs max <1-4> [<1-4>]",
448 CS_STR
449 CS_MAX_STR
450 "Maximum CS value to be used\n"
451 "Use a different maximum CS value for the uplink",
452 CMD_ATTR_IMMEDIATE)
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200453{
Pau Espin Pedrol343ec9b2020-10-30 18:35:54 +0100454 uint8_t cs_dl = atoi(argv[0]);
455 uint8_t cs_ul;
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200456
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200457 if (argc > 1)
Pau Espin Pedrol343ec9b2020-10-30 18:35:54 +0100458 cs_ul = atoi(argv[1]);
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200459 else
Pau Espin Pedrol343ec9b2020-10-30 18:35:54 +0100460 cs_ul = cs_dl;
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200461
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100462 gprs_pcu_set_max_cs(the_pcu, cs_dl, cs_ul);
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200463 return CMD_SUCCESS;
464}
465
Philipp Maier9459ebd2020-09-29 23:31:33 +0200466DEFUN_ATTR(cfg_pcu_no_cs_max,
467 cfg_pcu_no_cs_max_cmd,
468 "no cs max",
469 NO_STR CS_STR CS_MAX_STR,
470 CMD_ATTR_IMMEDIATE)
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200471{
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100472 gprs_pcu_set_max_cs(the_pcu, 0, 0);
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200473 return CMD_SUCCESS;
474}
475
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100476#define MCS_STR "Modulation and Coding Scheme configuration (EGPRS)\n"
Philipp Maier9459ebd2020-09-29 23:31:33 +0200477DEFUN_ATTR(cfg_pcu_mcs,
478 cfg_pcu_mcs_cmd,
479 "mcs <1-9> [<1-9>]",
480 MCS_STR
481 "Initial MCS value to be used (default 1)\n"
482 "Use a different initial MCS value for the uplink",
483 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +0100484{
Pau Espin Pedrol793583e2021-01-14 16:20:57 +0100485 uint8_t mcs_dl, mcs_ul;
486 mcs_dl = atoi(argv[0]);
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +0100487 if (argc > 1)
Pau Espin Pedrol793583e2021-01-14 16:20:57 +0100488 mcs_ul = atoi(argv[1]);
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +0100489 else
Pau Espin Pedrol793583e2021-01-14 16:20:57 +0100490 mcs_ul = mcs_dl;
491 the_pcu->vty.force_initial_mcs = true;
492 gprs_pcu_set_initial_mcs(the_pcu, mcs_dl, mcs_ul);
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +0100493 return CMD_SUCCESS;
494}
495
Philipp Maier9459ebd2020-09-29 23:31:33 +0200496DEFUN_ATTR(cfg_pcu_no_mcs,
497 cfg_pcu_no_mcs_cmd,
498 "no mcs",
499 NO_STR MCS_STR,
500 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +0100501{
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100502 the_pcu->vty.force_initial_mcs = false;
Pau Espin Pedrol793583e2021-01-14 16:20:57 +0100503 gprs_pcu_set_initial_mcs(the_pcu, 0, 0);
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +0100504 return CMD_SUCCESS;
505}
506
Philipp Maier9459ebd2020-09-29 23:31:33 +0200507DEFUN_ATTR(cfg_pcu_mcs_max,
508 cfg_pcu_mcs_max_cmd,
509 "mcs max <1-9> [<1-9>]",
510 MCS_STR
511 CS_MAX_STR
512 "Maximum MCS value to be used\n"
513 "Use a different maximum MCS value for the uplink",
514 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100515{
Pau Espin Pedrol343ec9b2020-10-30 18:35:54 +0100516 uint8_t mcs_dl = atoi(argv[0]);
517 uint8_t mcs_ul;
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100518
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100519 if (argc > 1)
Pau Espin Pedrol343ec9b2020-10-30 18:35:54 +0100520 mcs_ul = atoi(argv[1]);
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100521 else
Pau Espin Pedrol343ec9b2020-10-30 18:35:54 +0100522 mcs_ul = mcs_dl;
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100523
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100524 gprs_pcu_set_max_mcs(the_pcu, mcs_dl, mcs_ul);
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100525 return CMD_SUCCESS;
526}
527
Philipp Maier9459ebd2020-09-29 23:31:33 +0200528DEFUN_ATTR(cfg_pcu_no_mcs_max,
529 cfg_pcu_no_mcs_max_cmd,
530 "no mcs max",
531 NO_STR MCS_STR CS_MAX_STR,
532 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100533{
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100534 gprs_pcu_set_max_mcs(the_pcu, 0, 0);
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100535 return CMD_SUCCESS;
536}
537
Aravind Sirsikar50b09702016-08-22 17:21:10 +0530538#define DL_STR "downlink specific configuration\n"
539
Philipp Maier9459ebd2020-09-29 23:31:33 +0200540DEFUN_ATTR(cfg_pcu_dl_arq_type,
541 cfg_pcu_dl_arq_cmd,
542 "egprs dl arq-type (spb|arq2)",
543 EGPRS_STR DL_STR "ARQ options\n"
544 "enable SPB(ARQ1) support\n"
545 "enable ARQ2 support",
546 CMD_ATTR_IMMEDIATE)
Aravind Sirsikar50b09702016-08-22 17:21:10 +0530547{
Aravind Sirsikar50b09702016-08-22 17:21:10 +0530548 if (!strcmp(argv[0], "arq2"))
Pau Espin Pedrol97296b22021-01-14 13:08:02 +0100549 the_pcu->vty.dl_arq_type = EGPRS_ARQ2;
Aravind Sirsikar50b09702016-08-22 17:21:10 +0530550 else
Pau Espin Pedrol97296b22021-01-14 13:08:02 +0100551 the_pcu->vty.dl_arq_type = EGPRS_ARQ1;
Aravind Sirsikar50b09702016-08-22 17:21:10 +0530552
553 return CMD_SUCCESS;
554}
555
Philipp Maier9459ebd2020-09-29 23:31:33 +0200556DEFUN_USRATTR(cfg_pcu_window_size,
557 cfg_pcu_window_size_cmd,
558 X(PCU_VTY_ATTR_NEW_TBF),
559 "window-size <0-1024> [<0-256>]",
560 "Window size configuration (b + N_PDCH * f)\n"
561 "Base value (b)\n"
562 "Factor for number of PDCH (f)")
Jacob Erlbeck36df7742016-01-19 15:53:30 +0100563{
Jacob Erlbeck36df7742016-01-19 15:53:30 +0100564 uint16_t b = atoi(argv[0]);
565
Pau Espin Pedrol519d0712021-01-14 14:30:03 +0100566 the_pcu->vty.ws_base = b;
Jacob Erlbeck36df7742016-01-19 15:53:30 +0100567 if (argc > 1) {
568 uint16_t f = atoi(argv[1]);
Pau Espin Pedrol519d0712021-01-14 14:30:03 +0100569 the_pcu->vty.ws_pdch = f;
Jacob Erlbeck36df7742016-01-19 15:53:30 +0100570 }
571
572 return CMD_SUCCESS;
573}
574
575
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200576#define QUEUE_STR "Packet queue options\n"
577#define LIFETIME_STR "Set lifetime limit of LLC frame in centi-seconds " \
578 "(overrides the value given by SGSN)\n"
579
Philipp Maier9459ebd2020-09-29 23:31:33 +0200580DEFUN_USRATTR(cfg_pcu_queue_lifetime,
581 cfg_pcu_queue_lifetime_cmd,
582 X(PCU_VTY_ATTR_NEW_TBF),
583 "queue lifetime <1-65534>",
584 QUEUE_STR LIFETIME_STR "Lifetime in centi-seconds")
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200585{
Jacob Erlbeck2acfbeb2015-04-30 17:55:16 +0200586 uint16_t csec = atoi(argv[0]);
Pau Espin Pedrolf473ec92021-01-14 14:45:14 +0100587 the_pcu->vty.force_llc_lifetime = csec;
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200588 return CMD_SUCCESS;
589}
590
Philipp Maier9459ebd2020-09-29 23:31:33 +0200591DEFUN_USRATTR(cfg_pcu_queue_lifetime_inf,
592 cfg_pcu_queue_lifetime_inf_cmd,
593 X(PCU_VTY_ATTR_NEW_TBF),
594 "queue lifetime infinite",
595 QUEUE_STR LIFETIME_STR "Infinite lifetime")
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200596{
Pau Espin Pedrolf473ec92021-01-14 14:45:14 +0100597 the_pcu->vty.force_llc_lifetime = 0xffff;
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200598 return CMD_SUCCESS;
599}
600
Philipp Maier9459ebd2020-09-29 23:31:33 +0200601DEFUN_USRATTR(cfg_pcu_no_queue_lifetime,
602 cfg_pcu_no_queue_lifetime_cmd,
603 X(PCU_VTY_ATTR_NEW_TBF),
604 "no queue lifetime",
605 NO_STR QUEUE_STR "Disable lifetime limit of LLC frame (use value given "
606 "by SGSN)\n")
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200607{
Pau Espin Pedrolf473ec92021-01-14 14:45:14 +0100608 the_pcu->vty.force_llc_lifetime = 0;
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200609 return CMD_SUCCESS;
610}
611
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100612#define QUEUE_HYSTERESIS_STR "Set lifetime hysteresis of LLC frame in centi-seconds " \
613 "(continue discarding until lifetime-hysteresis is reached)\n"
614
Philipp Maier9459ebd2020-09-29 23:31:33 +0200615DEFUN_USRATTR(cfg_pcu_queue_hysteresis,
616 cfg_pcu_queue_hysteresis_cmd,
617 X(PCU_VTY_ATTR_NEW_TBF),
618 "queue hysteresis <1-65535>",
619 QUEUE_STR QUEUE_HYSTERESIS_STR "Hysteresis in centi-seconds")
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100620{
Jacob Erlbeck2acfbeb2015-04-30 17:55:16 +0200621 uint16_t csec = atoi(argv[0]);
Pau Espin Pedrolf473ec92021-01-14 14:45:14 +0100622 the_pcu->vty.llc_discard_csec = csec;
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100623 return CMD_SUCCESS;
624}
625
Philipp Maier9459ebd2020-09-29 23:31:33 +0200626DEFUN_USRATTR(cfg_pcu_no_queue_hysteresis,
627 cfg_pcu_no_queue_hysteresis_cmd,
628 X(PCU_VTY_ATTR_NEW_TBF),
629 "no queue hysteresis",
630 NO_STR QUEUE_STR QUEUE_HYSTERESIS_STR)
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100631{
Pau Espin Pedrolf473ec92021-01-14 14:45:14 +0100632 the_pcu->vty.llc_discard_csec = 0;
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100633 return CMD_SUCCESS;
634}
635
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200636#define QUEUE_CODEL_STR "Set CoDel queue management\n"
Philipp Maier9459ebd2020-09-29 23:31:33 +0200637DEFUN_USRATTR(cfg_pcu_queue_codel,
638 cfg_pcu_queue_codel_cmd,
639 X(PCU_VTY_ATTR_NEW_SUBSCR),
640 "queue codel",
641 QUEUE_STR QUEUE_CODEL_STR)
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200642{
Pau Espin Pedrolf473ec92021-01-14 14:45:14 +0100643 the_pcu->vty.llc_codel_interval_msec = LLC_CODEL_USE_DEFAULT;
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200644 return CMD_SUCCESS;
645}
646
Philipp Maier9459ebd2020-09-29 23:31:33 +0200647DEFUN_USRATTR(cfg_pcu_queue_codel_interval,
648 cfg_pcu_queue_codel_interval_cmd,
649 X(PCU_VTY_ATTR_NEW_SUBSCR),
650 "queue codel interval <1-1000>",
651 QUEUE_STR QUEUE_CODEL_STR "Specify interval\n" "Interval in centi-seconds")
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200652{
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200653 uint16_t csec = atoi(argv[0]);
Pau Espin Pedrolf473ec92021-01-14 14:45:14 +0100654 the_pcu->vty.llc_codel_interval_msec = 10*csec;
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200655 return CMD_SUCCESS;
656}
657
Philipp Maier9459ebd2020-09-29 23:31:33 +0200658DEFUN_USRATTR(cfg_pcu_no_queue_codel,
659 cfg_pcu_no_queue_codel_cmd,
660 X(PCU_VTY_ATTR_NEW_SUBSCR),
661 "no queue codel",
662 NO_STR QUEUE_STR QUEUE_CODEL_STR)
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200663{
Pau Espin Pedrolf473ec92021-01-14 14:45:14 +0100664 the_pcu->vty.llc_codel_interval_msec = LLC_CODEL_DISABLE;
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200665 return CMD_SUCCESS;
666}
667
668
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200669#define QUEUE_IDLE_ACK_STR "Request an ACK after the last DL LLC frame in centi-seconds\n"
670
Philipp Maier9459ebd2020-09-29 23:31:33 +0200671DEFUN_ATTR(cfg_pcu_queue_idle_ack_delay,
672 cfg_pcu_queue_idle_ack_delay_cmd,
673 "queue idle-ack-delay <1-65535>",
674 QUEUE_STR QUEUE_IDLE_ACK_STR "Idle ACK delay in centi-seconds",
675 CMD_ATTR_IMMEDIATE)
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200676{
Jacob Erlbeck2acfbeb2015-04-30 17:55:16 +0200677 uint16_t csec = atoi(argv[0]);
Pau Espin Pedrolf473ec92021-01-14 14:45:14 +0100678 the_pcu->vty.llc_idle_ack_csec = csec;
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200679 return CMD_SUCCESS;
680}
681
Philipp Maier9459ebd2020-09-29 23:31:33 +0200682DEFUN_ATTR(cfg_pcu_no_queue_idle_ack_delay,
683 cfg_pcu_no_queue_idle_ack_delay_cmd,
684 "no queue idle-ack-delay",
685 NO_STR QUEUE_STR QUEUE_IDLE_ACK_STR,
686 CMD_ATTR_IMMEDIATE)
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200687{
Pau Espin Pedrolf473ec92021-01-14 14:45:14 +0100688 the_pcu->vty.llc_idle_ack_csec = 0;
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200689 return CMD_SUCCESS;
690}
691
Philipp Maier9459ebd2020-09-29 23:31:33 +0200692DEFUN_ATTR(cfg_pcu_alloc,
693 cfg_pcu_alloc_cmd,
694 "alloc-algorithm (a|b|dynamic)",
695 "Select slot allocation algorithm to use when assigning timeslots on "
696 "PACCH\n"
697 "Single slot is assigned only\n"
698 "Multiple slots are assigned for semi-duplex operation\n"
699 "Dynamically select the algorithm based on the system state\n",
700 CMD_ATTR_IMMEDIATE)
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200701{
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200702 switch (argv[0][0]) {
703 case 'a':
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100704 the_pcu->alloc_algorithm = alloc_algorithm_a;
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200705 break;
706 case 'b':
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100707 the_pcu->alloc_algorithm = alloc_algorithm_b;
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200708 break;
Jacob Erlbeck400ec022015-07-14 13:31:48 +0200709 default:
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100710 the_pcu->alloc_algorithm = alloc_algorithm_dynamic;
Jacob Erlbeck400ec022015-07-14 13:31:48 +0200711 break;
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200712 }
713
714 return CMD_SUCCESS;
715}
716
Philipp Maier9459ebd2020-09-29 23:31:33 +0200717DEFUN_ATTR(cfg_pcu_two_phase,
718 cfg_pcu_two_phase_cmd,
719 "two-phase-access",
720 "Force two phase access when MS requests single phase access\n",
721 CMD_ATTR_IMMEDIATE)
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200722{
Pau Espin Pedrol03de8982021-01-14 12:48:50 +0100723 the_pcu->vty.force_two_phase = 1;
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200724 return CMD_SUCCESS;
725}
726
Philipp Maier9459ebd2020-09-29 23:31:33 +0200727DEFUN_ATTR(cfg_pcu_no_two_phase,
728 cfg_pcu_no_two_phase_cmd,
729 "no two-phase-access",
730 NO_STR "Only use two phase access when requested my MS\n",
731 CMD_ATTR_IMMEDIATE)
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200732{
Pau Espin Pedrol03de8982021-01-14 12:48:50 +0100733 the_pcu->vty.force_two_phase = 0;
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200734 return CMD_SUCCESS;
735}
736
Philipp Maier9459ebd2020-09-29 23:31:33 +0200737DEFUN_ATTR(cfg_pcu_alpha,
738 cfg_pcu_alpha_cmd,
Pau Espin Pedrolfe8de452021-02-09 18:47:34 +0100739 "alpha (si13|<0-10>)",
Philipp Maier9459ebd2020-09-29 23:31:33 +0200740 "Alpha parameter for MS power control in units of 0.1 (see TS 05.08) "
741 "NOTE: Be sure to set Alpha value at System information 13 too.\n"
Pau Espin Pedrolfe8de452021-02-09 18:47:34 +0100742 "Use value received from BSC in System Intormation 13 (default)\n"
743 "Force Alpha in units of 0.1\n",
744 CMD_ATTR_IMMEDIATE | CMD_ATTR_DEPRECATED)
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200745{
Pau Espin Pedrolfe8de452021-02-09 18:47:34 +0100746 vty_out(vty, "%% 'alpha <0-10>' is now deprecated: use osmo-bsc's 'gprs power-control alpha <0-10>' instead%s",
747 VTY_NEWLINE);
748 if (strcmp(argv[0], "si13") == 0)
749 the_pcu->vty.force_alpha = (uint8_t) -1;
750 else
751 the_pcu->vty.force_alpha = atoi(argv[0]);
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200752 return CMD_SUCCESS;
753}
754
Philipp Maier9459ebd2020-09-29 23:31:33 +0200755DEFUN_ATTR(cfg_pcu_gamma,
756 cfg_pcu_gamma_cmd,
757 "gamma <0-62>",
758 "Gamma parameter for MS power control in units of dB (see TS 05.08)\n"
759 "Gamma in even unit of dBs\n",
760 CMD_ATTR_IMMEDIATE)
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200761{
Pau Espin Pedrola2814952021-01-14 12:53:53 +0100762 the_pcu->vty.gamma = atoi(argv[0]) / 2;
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200763 return CMD_SUCCESS;
764}
765
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +0100766DEFUN(show_bts_stats,
767 show_bts_stats_cmd,
768 "show bts statistics",
769 SHOW_STR "BTS related functionality\nStatistics\n")
770{
Pau Espin Pedrold1049dc2021-01-18 17:14:14 +0100771 struct gprs_rlcmac_bts *bts;
772 llist_for_each_entry(bts, &the_pcu->bts_list, list) {
773 vty_out(vty, "BTS%" PRIu8 ":%s", bts->nr, VTY_NEWLINE);
774 vty_out_rate_ctr_group(vty, " ", bts_rate_counters(bts));
775 }
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +0100776 return CMD_SUCCESS;
Daniel Willmann772415f2014-01-15 17:06:51 +0100777}
778
Pau Espin Pedrola1ac2f02020-09-22 17:01:31 +0200779DEFUN(show_bts_pdch,
780 show_bts_pdch_cmd,
781 "show bts pdch",
782 SHOW_STR "BTS related functionality\nPDCH timeslots\n")
783{
Pau Espin Pedrold1049dc2021-01-18 17:14:14 +0100784 struct gprs_rlcmac_bts *bts;
785 llist_for_each_entry(bts, &the_pcu->bts_list, list) {
786 pcu_vty_show_bts_pdch(vty, bts);
787 }
788 return CMD_SUCCESS;
Pau Espin Pedrola1ac2f02020-09-22 17:01:31 +0200789}
790
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100791#define IDLE_TIME_STR "keep an idle DL TBF alive for the time given\n"
Pau Espin Pedrol2b5c6292019-09-09 13:41:00 +0200792DEFUN_DEPRECATED(cfg_pcu_dl_tbf_idle_time,
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100793 cfg_pcu_dl_tbf_idle_time_cmd,
794 "dl-tbf-idle-time <1-5000>",
795 IDLE_TIME_STR "idle time in msec")
796{
Pau Espin Pedrol2b5c6292019-09-09 13:41:00 +0200797 vty_out(vty, "%% 'dl-tbf-idle-time' is now deprecated: use 'timer X2031 <val>' instead%s", VTY_NEWLINE);
798
Pau Espin Pedrol924aaad2021-01-14 12:01:42 +0100799 if (osmo_tdef_set(the_pcu->T_defs, -2031, atoi(argv[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
Pau Espin Pedrol2b5c6292019-09-09 13:41:00 +0200804DEFUN_DEPRECATED(cfg_pcu_no_dl_tbf_idle_time,
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100805 cfg_pcu_no_dl_tbf_idle_time_cmd,
806 "no dl-tbf-idle-time",
807 NO_STR IDLE_TIME_STR)
808{
Pau Espin Pedrol2b5c6292019-09-09 13:41:00 +0200809 vty_out(vty, "%% 'no dl-tbf-idle-time' is now deprecated: use 'timer X2031 0' instead%s", VTY_NEWLINE);
810
Pau Espin Pedrol924aaad2021-01-14 12:01:42 +0100811 if (osmo_tdef_set(the_pcu->T_defs, -2031, 0, OSMO_TDEF_MS) < 0)
Pau Espin Pedrol2b5c6292019-09-09 13:41:00 +0200812 return CMD_WARNING;
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100813 return CMD_SUCCESS;
814}
815
Oliver Smith45fdc442019-09-05 15:12:20 +0200816#define RETRANSMISSION_STR "retransmit blocks even before the MS had a chance to receive them (better throughput," \
817 " less readable traces)"
Philipp Maier9459ebd2020-09-29 23:31:33 +0200818DEFUN_ATTR(cfg_pcu_dl_tbf_preemptive_retransmission,
819 cfg_pcu_dl_tbf_preemptive_retransmission_cmd,
820 "dl-tbf-preemptive-retransmission",
821 RETRANSMISSION_STR " (enabled by default)",
822 CMD_ATTR_IMMEDIATE)
Oliver Smith45fdc442019-09-05 15:12:20 +0200823{
Pau Espin Pedrol05f9f592021-01-14 12:56:58 +0100824 the_pcu->vty.dl_tbf_preemptive_retransmission = true;
Oliver Smith45fdc442019-09-05 15:12:20 +0200825 return CMD_SUCCESS;
826}
827
Philipp Maier9459ebd2020-09-29 23:31:33 +0200828DEFUN_ATTR(cfg_pcu_no_dl_tbf_preemptive_retransmission,
829 cfg_pcu_no_dl_tbf_preemptive_retransmission_cmd,
830 "no dl-tbf-preemptive-retransmission",
831 NO_STR RETRANSMISSION_STR,
832 CMD_ATTR_IMMEDIATE)
Oliver Smith45fdc442019-09-05 15:12:20 +0200833{
Pau Espin Pedrol05f9f592021-01-14 12:56:58 +0100834 the_pcu->vty.dl_tbf_preemptive_retransmission = false;
Oliver Smith45fdc442019-09-05 15:12:20 +0200835 return CMD_SUCCESS;
836}
837
Jacob Erlbecka098c192015-05-28 16:11:19 +0200838#define MS_IDLE_TIME_STR "keep an idle MS object alive for the time given\n"
Pau Espin Pedrol63700ea2019-09-09 13:19:06 +0200839DEFUN_DEPRECATED(cfg_pcu_ms_idle_time,
Jacob Erlbecka098c192015-05-28 16:11:19 +0200840 cfg_pcu_ms_idle_time_cmd,
841 "ms-idle-time <1-7200>",
842 MS_IDLE_TIME_STR "idle time in sec")
843{
Pau Espin Pedrol63700ea2019-09-09 13:19:06 +0200844 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 +0100845 if (osmo_tdef_set(the_pcu->T_defs, -2030, atoi(argv[0]), OSMO_TDEF_S) < 0)
Pau Espin Pedrol63700ea2019-09-09 13:19:06 +0200846 return CMD_WARNING;
Jacob Erlbecka098c192015-05-28 16:11:19 +0200847 return CMD_SUCCESS;
848}
849
Pau Espin Pedrol63700ea2019-09-09 13:19:06 +0200850DEFUN_DEPRECATED(cfg_pcu_no_ms_idle_time,
Jacob Erlbecka098c192015-05-28 16:11:19 +0200851 cfg_pcu_no_ms_idle_time_cmd,
852 "no ms-idle-time",
853 NO_STR MS_IDLE_TIME_STR)
854{
Pau Espin Pedrol63700ea2019-09-09 13:19:06 +0200855 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 +0100856 if (osmo_tdef_set(the_pcu->T_defs, -2030, 0, OSMO_TDEF_S) < 0)
Pau Espin Pedrol63700ea2019-09-09 13:19:06 +0200857 return CMD_WARNING;
Jacob Erlbecka098c192015-05-28 16:11:19 +0200858 return CMD_SUCCESS;
859}
860
Pau Espin Pedrol1e6eb302019-11-28 17:00:44 +0100861#define CS_ERR_LIMITS_STR "set thresholds for error rate based downlink (M)CS adjustment\n"
Philipp Maier9459ebd2020-09-29 23:31:33 +0200862DEFUN_ATTR(cfg_pcu_cs_err_limits,
863 cfg_pcu_cs_err_limits_cmd,
864 "cs threshold <0-100> <0-100>",
865 CS_STR CS_ERR_LIMITS_STR "lower limit in %\n" "upper limit in %\n",
866 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200867{
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200868 uint8_t lower_limit = atoi(argv[0]);
869 uint8_t upper_limit = atoi(argv[1]);
870
871 if (lower_limit > upper_limit) {
872 vty_out(vty,
873 "The lower limit must be less than or equal to the "
874 "upper limit.%s", VTY_NEWLINE);
875 return CMD_WARNING;
876 }
877
Pau Espin Pedrole8dcf642021-01-14 13:17:01 +0100878 the_pcu->vty.cs_adj_enabled = true;
879 the_pcu->vty.cs_adj_upper_limit = upper_limit;
880 the_pcu->vty.cs_adj_lower_limit = lower_limit;
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200881
882 return CMD_SUCCESS;
883}
884
Philipp Maier9459ebd2020-09-29 23:31:33 +0200885DEFUN_ATTR(cfg_pcu_no_cs_err_limits,
886 cfg_pcu_no_cs_err_limits_cmd,
887 "no cs threshold",
888 NO_STR CS_STR CS_ERR_LIMITS_STR,
889 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200890{
Pau Espin Pedrole8dcf642021-01-14 13:17:01 +0100891 the_pcu->vty.cs_adj_enabled = false;
892 the_pcu->vty.cs_adj_upper_limit = 100;
893 the_pcu->vty.cs_adj_lower_limit = 0;
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200894
895 return CMD_SUCCESS;
896}
897
Pau Espin Pedrol1e6eb302019-11-28 17:00:44 +0100898#define CS_DOWNGRADE_STR "set threshold for data size based downlink (M)CS downgrade\n"
Philipp Maier9459ebd2020-09-29 23:31:33 +0200899DEFUN_ATTR(cfg_pcu_cs_downgrade_thrsh,
900 cfg_pcu_cs_downgrade_thrsh_cmd,
901 "cs downgrade-threshold <1-10000>",
902 CS_STR CS_DOWNGRADE_STR "downgrade if less octets left\n",
903 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +0200904{
Pau Espin Pedrolad79b852021-01-14 13:20:55 +0100905 the_pcu->vty.cs_downgrade_threshold = atoi(argv[0]);
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +0200906 return CMD_SUCCESS;
907}
908
Philipp Maier9459ebd2020-09-29 23:31:33 +0200909DEFUN_ATTR(cfg_pcu_no_cs_downgrade_thrsh,
910 cfg_pcu_no_cs_downgrade_thrsh_cmd,
911 "no cs downgrade-threshold",
912 NO_STR CS_STR CS_DOWNGRADE_STR,
913 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +0200914{
Pau Espin Pedrolad79b852021-01-14 13:20:55 +0100915 the_pcu->vty.cs_downgrade_threshold = 0;
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +0200916 return CMD_SUCCESS;
917}
918
Philipp Maier9459ebd2020-09-29 23:31:33 +0200919DEFUN_ATTR(cfg_pcu_cs_lqual_ranges,
920 cfg_pcu_cs_lqual_ranges_cmd,
921 "cs link-quality-ranges cs1 <0-35> cs2 <0-35> <0-35> cs3 <0-35> <0-35> cs4 <0-35>",
922 CS_STR "Set link quality ranges for each uplink CS\n"
923 "Set quality range for CS-1 (high value only)\n"
924 "CS-1 high (dB)\n"
925 "Set quality range for CS-2\n"
926 "CS-2 low (dB)\n"
927 "CS-2 high (dB)\n"
928 "Set quality range for CS-3\n"
929 "CS-3 low (dB)\n"
930 "CS-3 high (dB)\n"
931 "Set quality range for CS-4 (low value only)\n"
932 "CS-4 low (dB)\n",
933 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck94cde132015-06-09 09:44:36 +0200934{
Jacob Erlbeck94cde132015-06-09 09:44:36 +0200935 uint8_t cs1_high = atoi(argv[0]);
936 uint8_t cs2_low = atoi(argv[1]);
937 uint8_t cs2_high = atoi(argv[2]);
938 uint8_t cs3_low = atoi(argv[3]);
939 uint8_t cs3_high = atoi(argv[4]);
940 uint8_t cs4_low = atoi(argv[5]);
941
Pau Espin Pedrol54b159a2021-01-14 13:30:04 +0100942 the_pcu->vty.cs_lqual_ranges[0].high = cs1_high;
943 the_pcu->vty.cs_lqual_ranges[1].low = cs2_low;
944 the_pcu->vty.cs_lqual_ranges[1].high = cs2_high;
945 the_pcu->vty.cs_lqual_ranges[2].low = cs3_low;
946 the_pcu->vty.cs_lqual_ranges[2].high = cs3_high;
947 the_pcu->vty.cs_lqual_ranges[3].low = cs4_low;
Jacob Erlbeck94cde132015-06-09 09:44:36 +0200948
949 return CMD_SUCCESS;
950}
951
Philipp Maier9459ebd2020-09-29 23:31:33 +0200952DEFUN_ATTR(cfg_pcu_mcs_lqual_ranges,
953 cfg_pcu_mcs_lqual_ranges_cmd,
954 "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>",
955 CS_STR "Set link quality ranges for each uplink MCS\n"
956 "Set quality range for MCS-1 (high value only)\n"
957 "MCS-1 high (dB)\n"
958 "Set quality range for MCS-2\n"
959 "MCS-2 high (dB)\n"
960 "MCS-2 low (dB)\n"
961 "Set quality range for MCS-3\n"
962 "MCS-3 high (dB)\n"
963 "MCS-3 low (dB)\n"
964 "Set quality range for MCS-4\n"
965 "MCS-4 high (dB)\n"
966 "MCS-4 low (dB)\n"
967 "Set quality range for MCS-5\n"
968 "MCS-5 high (dB)\n"
969 "MCS-5 low (dB)\n"
970 "Set quality range for MCS-6\n"
971 "MCS-6 low (dB)\n"
972 "MCS-6 high (dB)\n"
973 "Set quality range for MCS-7\n"
974 "MCS-7 low (dB)\n"
975 "MCS-7 high (dB)\n"
976 "Set quality range for MCS-8\n"
977 "MCS-8 low (dB)\n"
978 "MCS-8 high (dB)\n"
979 "Set quality range for MCS-9 (low value only)\n"
980 "MCS-9 low (dB)\n",
981 CMD_ATTR_IMMEDIATE)
Minh-Quang Nguyen1f189092017-08-16 09:50:06 -0400982{
Pau Espin Pedrol54b159a2021-01-14 13:30:04 +0100983 the_pcu->vty.mcs_lqual_ranges[0].high = atoi(argv[0]);
984 the_pcu->vty.mcs_lqual_ranges[1].low = atoi(argv[1]);
985 the_pcu->vty.mcs_lqual_ranges[1].high = atoi(argv[2]);
986 the_pcu->vty.mcs_lqual_ranges[2].low = atoi(argv[3]);
987 the_pcu->vty.mcs_lqual_ranges[2].high = atoi(argv[4]);
988 the_pcu->vty.mcs_lqual_ranges[3].low = atoi(argv[5]);
989 the_pcu->vty.mcs_lqual_ranges[3].high = atoi(argv[6]);
990 the_pcu->vty.mcs_lqual_ranges[4].low = atoi(argv[7]);
991 the_pcu->vty.mcs_lqual_ranges[4].high = atoi(argv[8]);
992 the_pcu->vty.mcs_lqual_ranges[5].low = atoi(argv[9]);
993 the_pcu->vty.mcs_lqual_ranges[5].high = atoi(argv[10]);
994 the_pcu->vty.mcs_lqual_ranges[6].low = atoi(argv[11]);
995 the_pcu->vty.mcs_lqual_ranges[6].high = atoi(argv[12]);
996 the_pcu->vty.mcs_lqual_ranges[7].low = atoi(argv[13]);
997 the_pcu->vty.mcs_lqual_ranges[7].high = atoi(argv[14]);
998 the_pcu->vty.mcs_lqual_ranges[8].low = atoi(argv[15]);
Minh-Quang Nguyen1f189092017-08-16 09:50:06 -0400999
1000 return CMD_SUCCESS;
1001}
1002
Pau Espin Pedrolc4178e52017-08-08 15:03:50 +02001003DEFUN(cfg_pcu_sock,
1004 cfg_pcu_sock_cmd,
1005 "pcu-socket PATH",
1006 "Configure the osmo-bts PCU socket file/path name\n"
1007 "Path of the socket to connect to\n")
1008{
Vadim Yanitskiyfc75cc02019-11-30 20:13:25 +07001009 if (vty->type != VTY_FILE)
1010 vty_out(vty, "Changing PCU socket path at run-time has no effect%s", VTY_NEWLINE);
1011
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +01001012 osmo_talloc_replace_string(tall_pcu_ctx, &the_pcu->pcu_sock_path, argv[0]);
Pau Espin Pedrolc4178e52017-08-08 15:03:50 +02001013
1014 return CMD_SUCCESS;
1015}
Jacob Erlbeck94cde132015-06-09 09:44:36 +02001016
Philipp Maier9459ebd2020-09-29 23:31:33 +02001017DEFUN_USRATTR(cfg_pcu_gb_dialect,
1018 cfg_pcu_gb_dialect_cmd,
1019 X(PCU_VTY_ATTR_NS_RESET),
1020 "gb-dialect (classic|ip-sns)",
1021 "Select which Gb interface dialect to use\n"
1022 "Classic Gb interface with NS-{RESET,BLOCK,UNBLOCK} and static configuration\n"
1023 "Modern Gb interface with IP-SNS (Sub Network Service) and dynamic configuration\n")
Harald Welte57d35152018-07-05 03:11:17 +02001024{
Alexander Couzens290d9032020-09-16 21:52:02 +02001025 if (!strcmp(argv[0], "ip-sns")) {
Alexander Couzensf7ec5252021-01-25 20:28:38 +01001026 the_pcu->vty.ns_dialect = GPRS_NS2_DIALECT_SNS;
Alexander Couzens290d9032020-09-16 21:52:02 +02001027 } else {
Alexander Couzensf7ec5252021-01-25 20:28:38 +01001028 the_pcu->vty.ns_dialect = GPRS_NS2_DIALECT_IPACCESS;
Alexander Couzens290d9032020-09-16 21:52:02 +02001029 }
Harald Welte57d35152018-07-05 03:11:17 +02001030
1031 return CMD_SUCCESS;
1032}
1033
Pau Espin Pedrolc0a250d2021-01-21 18:46:13 +01001034DEFUN(cfg_neighbor_resolution, cfg_neighbor_resolution_cmd,
1035 "neighbor resolution " VTY_IPV46_CMD " [<0-65535>]",
1036 "Manage local and remote-BSS neighbor cells\n"
1037 "Connect to Neighbor Resolution Service (CTRL interface) to given ip and port\n"
1038 "IPv4 address to connect to\n" "IPv6 address to connect to\n"
1039 "Port to connect to (default 4248)\n")
1040{
1041 osmo_talloc_replace_string(the_pcu, &the_pcu->vty.neigh_ctrl_addr, argv[0]);
1042 if (argc > 1)
1043 the_pcu->vty.neigh_ctrl_port = atoi(argv[1]);
1044 else
1045 the_pcu->vty.neigh_ctrl_port = OSMO_CTRL_PORT_BSC_NEIGH;
1046 return CMD_SUCCESS;
1047}
1048
1049
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +02001050DEFUN(show_bts_timer, show_bts_timer_cmd,
1051 "show bts-timer " OSMO_TDEF_VTY_ARG_T_OPTIONAL,
1052 SHOW_STR "Show BTS controlled timers\n"
1053 OSMO_TDEF_VTY_DOC_T)
1054{
Pau Espin Pedrold1049dc2021-01-18 17:14:14 +01001055 struct gprs_rlcmac_bts *bts;
1056 llist_for_each_entry(bts, &the_pcu->bts_list, list) {
1057 const char *T_arg = argc > 0 ? argv[0] : NULL;
1058 vty_out(vty, "BTS%" PRIu8 ":%s", bts->nr, VTY_NEWLINE);
1059 osmo_tdef_vty_show_cmd(vty, bts->T_defs_bts, T_arg, " ");
1060 }
1061 return CMD_SUCCESS;
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +02001062}
1063
1064DEFUN(show_timer, show_timer_cmd,
1065 "show timer " OSMO_TDEF_VTY_ARG_T_OPTIONAL,
1066 SHOW_STR "Show PCU timers\n"
1067 OSMO_TDEF_VTY_DOC_T)
1068{
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +02001069 const char *T_arg = argc > 0 ? argv[0] : NULL;
Pau Espin Pedrol924aaad2021-01-14 12:01:42 +01001070 return osmo_tdef_vty_show_cmd(vty, the_pcu->T_defs, T_arg, NULL);
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +02001071}
1072
Philipp Maier9459ebd2020-09-29 23:31:33 +02001073DEFUN_ATTR(cfg_pcu_timer, cfg_pcu_timer_cmd,
1074 "timer " OSMO_TDEF_VTY_ARG_SET_OPTIONAL,
1075 "Configure or show PCU timers\n"
1076 OSMO_TDEF_VTY_DOC_SET,
1077 CMD_ATTR_IMMEDIATE)
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +02001078{
Pau Espin Pedrolab7159f2021-01-26 17:51:44 +01001079 int rc;
1080 struct osmo_tdef *t;
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +02001081 /* If any arguments are missing, redirect to 'show' */
1082 if (argc < 2)
1083 return show_timer(self, vty, argc, argv);
Pau Espin Pedrolab7159f2021-01-26 17:51:44 +01001084 if ((rc = osmo_tdef_vty_set_cmd(vty, the_pcu->T_defs, argv)) != CMD_SUCCESS)
1085 return rc;
1086 t = osmo_tdef_vty_parse_T_arg(vty, the_pcu->T_defs, argv[0]);
1087 switch (t->T) {
1088 case PCU_TDEF_NEIGH_CACHE_ALIVE:
1089 neigh_cache_set_keep_time_interval(the_pcu->neigh_cache, t->val);
1090 break;
1091 case PCU_TDEF_SI_CACHE_ALIVE:
1092 si_cache_set_keep_time_interval(the_pcu->si_cache, t->val);
1093 break;
1094 default:
1095 break;
1096 }
1097 return CMD_SUCCESS;
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +02001098}
1099
Daniel Willmann772415f2014-01-15 17:06:51 +01001100DEFUN(show_tbf,
1101 show_tbf_cmd,
Max12a09872018-02-01 16:07:33 +01001102 "show tbf (all|ccch|pacch)",
1103 SHOW_STR "information about TBFs\n"
1104 "All TBFs\n"
1105 "TBFs allocated via CCCH\n"
1106 "TBFs allocated via PACCH\n")
Daniel Willmann772415f2014-01-15 17:06:51 +01001107{
Pau Espin Pedrold1049dc2021-01-18 17:14:14 +01001108 struct gprs_rlcmac_bts *bts;
1109 llist_for_each_entry(bts, &the_pcu->bts_list, list) {
1110 uint32_t flags = UINT32_MAX;
Max12a09872018-02-01 16:07:33 +01001111
Pau Espin Pedrold1049dc2021-01-18 17:14:14 +01001112 if (argv[0][0] == 'c')
1113 flags = (1 << GPRS_RLCMAC_FLAG_CCCH);
1114 else if (argv[0][0] == 'p')
1115 flags = (1 << GPRS_RLCMAC_FLAG_PACCH);
Max12a09872018-02-01 16:07:33 +01001116
Pau Espin Pedrold1049dc2021-01-18 17:14:14 +01001117 pcu_vty_show_tbf_all(vty, bts, flags);
1118 }
1119 return CMD_SUCCESS;
Daniel Willmann772415f2014-01-15 17:06:51 +01001120}
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +01001121
Jacob Erlbeckf47f68a2015-06-04 10:23:24 +02001122DEFUN(show_ms_all,
1123 show_ms_all_cmd,
1124 "show ms all",
1125 SHOW_STR "information about MSs\n" "All TBFs\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 pcu_vty_show_ms_all(vty, bts);
1130 }
1131 return CMD_SUCCESS;
Jacob Erlbeckf47f68a2015-06-04 10:23:24 +02001132}
1133
Jacob Erlbeck37e896d2015-06-05 16:33:33 +02001134DEFUN(show_ms_tlli,
1135 show_ms_tlli_cmd,
1136 "show ms tlli TLLI",
1137 SHOW_STR "information about MSs\n" "Select MS by TLLI\n" "TLLI as hex\n")
1138{
Pau Espin Pedrold1049dc2021-01-18 17:14:14 +01001139 struct gprs_rlcmac_bts *bts;
1140 llist_for_each_entry(bts, &the_pcu->bts_list, list) {
1141 char *endp = NULL;
1142 unsigned long long tlli = strtoll(argv[0], &endp, 16);
1143 if ((endp != NULL && *endp != 0) || tlli > 0xffffffffULL) {
1144 vty_out(vty, "Invalid TLLI.%s", VTY_NEWLINE);
1145 return CMD_WARNING;
1146 }
1147 pcu_vty_show_ms_by_tlli(vty, bts, (uint32_t)tlli);
Jacob Erlbeck37e896d2015-06-05 16:33:33 +02001148 }
Pau Espin Pedrold1049dc2021-01-18 17:14:14 +01001149 return CMD_SUCCESS;
Jacob Erlbeck37e896d2015-06-05 16:33:33 +02001150}
1151
1152DEFUN(show_ms_imsi,
1153 show_ms_imsi_cmd,
1154 "show ms imsi IMSI",
1155 SHOW_STR "information about MSs\n" "Select MS by IMSI\n" "IMSI\n")
1156{
Pau Espin Pedrold1049dc2021-01-18 17:14:14 +01001157 struct gprs_rlcmac_bts *bts;
1158 llist_for_each_entry(bts, &the_pcu->bts_list, list) {
1159 pcu_vty_show_ms_by_imsi(vty, bts, argv[0]);
1160 }
1161 return CMD_SUCCESS;
Jacob Erlbeck37e896d2015-06-05 16:33:33 +02001162}
1163
Andreas Eversberg12942562012-07-12 14:31:57 +02001164static const char pcu_copyright[] =
Harald Welted1e340f2013-01-17 12:24:29 +01001165 "Copyright (C) 2012 by Ivan Kluchnikov <kluchnikovi@gmail.com> and \r\n"
1166 " Andreas Eversberg <jolly@eversberg.eu>\r\n"
Andreas Eversberg12942562012-07-12 14:31:57 +02001167 "License GNU GPL version 2 or later\r\n"
1168 "This is free software: you are free to change and redistribute it.\r\n"
1169 "There is NO WARRANTY, to the extent permitted by law.\r\n";
1170
1171struct vty_app_info pcu_vty_info = {
Pau Espin Pedrold0fc9e82019-11-29 13:37:45 +01001172 .name = "OsmoPCU",
Andreas Eversberg12942562012-07-12 14:31:57 +02001173 .version = PACKAGE_VERSION,
1174 .copyright = pcu_copyright,
Philipp Maier9459ebd2020-09-29 23:31:33 +02001175 .usr_attr_desc = {
1176 [PCU_VTY_ATTR_NEW_TBF] = \
1177 "This command applies when a new TBF is begins",
1178 [PCU_VTY_ATTR_NEW_SUBSCR] = \
1179 "This command applies when a new subscriber attaches",
1180 [PCU_VTY_ATTR_NS_RESET] = \
1181 "This command applies when the NS is reset",
1182 },
1183 .usr_attr_letters = {
1184 [PCU_VTY_ATTR_NEW_TBF] = 'n',
1185 [PCU_VTY_ATTR_NEW_SUBSCR] = 's',
1186 [PCU_VTY_ATTR_NS_RESET] = 'r',
1187 },
Andreas Eversberg12942562012-07-12 14:31:57 +02001188};
1189
Pau Espin Pedrolcd2ac562019-08-05 14:30:44 +02001190int pcu_vty_init(void)
Andreas Eversberg12942562012-07-12 14:31:57 +02001191{
1192// install_element_ve(&show_pcu_cmd);
1193
Harald Welte717cdf52017-07-21 21:56:23 +02001194 cfg_pcu_gsmtap_categ_cmd.string = vty_cmd_string_from_valstr(tall_pcu_ctx, pcu_gsmtap_categ_names,
1195 "gsmtap-category (",
1196 "|",")", VTY_DO_LOWER);
1197 cfg_pcu_gsmtap_categ_cmd.doc = vty_cmd_string_from_valstr(tall_pcu_ctx, pcu_gsmtap_categ_help,
1198 "GSMTAP Category\n",
1199 "\n", "", 0);
1200 cfg_pcu_no_gsmtap_categ_cmd.string = vty_cmd_string_from_valstr(tall_pcu_ctx, pcu_gsmtap_categ_names,
1201 "no gsmtap-category (",
1202 "|",")", VTY_DO_LOWER);
1203 cfg_pcu_no_gsmtap_categ_cmd.doc = vty_cmd_string_from_valstr(tall_pcu_ctx, pcu_gsmtap_categ_help,
1204 NO_STR "GSMTAP Category\n",
1205 "\n", "", 0);
1206
Pau Espin Pedrolcd2ac562019-08-05 14:30:44 +02001207 logging_vty_add_cmds();
1208 osmo_stats_vty_add_cmds();
Vadim Yanitskiyd83c8ff2020-02-06 16:46:17 +07001209 osmo_talloc_vty_add_cmds();
Vadim Yanitskiy830ca262021-02-05 23:22:37 +01001210 osmo_fsm_vty_add_cmds();
Andreas Eversberg12942562012-07-12 14:31:57 +02001211
Andreas Eversberg8b761a32012-07-20 21:50:31 +02001212 install_node(&pcu_node, config_write_pcu);
1213 install_element(CONFIG_NODE, &cfg_pcu_cmd);
Jacob Erlbeck953c7892015-09-28 18:12:57 +02001214 install_element(PCU_NODE, &cfg_pcu_egprs_cmd);
1215 install_element(PCU_NODE, &cfg_pcu_no_egprs_cmd);
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +02001216 install_element(PCU_NODE, &cfg_pcu_no_two_phase_cmd);
Andreas Eversberg8b761a32012-07-20 21:50:31 +02001217 install_element(PCU_NODE, &cfg_pcu_cs_cmd);
1218 install_element(PCU_NODE, &cfg_pcu_no_cs_cmd);
Jacob Erlbeckb33e6752015-06-04 19:04:30 +02001219 install_element(PCU_NODE, &cfg_pcu_cs_max_cmd);
1220 install_element(PCU_NODE, &cfg_pcu_no_cs_max_cmd);
Jacob Erlbeck8322d082015-06-04 15:12:10 +02001221 install_element(PCU_NODE, &cfg_pcu_cs_err_limits_cmd);
1222 install_element(PCU_NODE, &cfg_pcu_no_cs_err_limits_cmd);
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +02001223 install_element(PCU_NODE, &cfg_pcu_cs_downgrade_thrsh_cmd);
1224 install_element(PCU_NODE, &cfg_pcu_no_cs_downgrade_thrsh_cmd);
Jacob Erlbeck94cde132015-06-09 09:44:36 +02001225 install_element(PCU_NODE, &cfg_pcu_cs_lqual_ranges_cmd);
Minh-Quang Nguyen1f189092017-08-16 09:50:06 -04001226 install_element(PCU_NODE, &cfg_pcu_mcs_lqual_ranges_cmd);
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +01001227 install_element(PCU_NODE, &cfg_pcu_mcs_cmd);
Aravind Sirsikar50b09702016-08-22 17:21:10 +05301228 install_element(PCU_NODE, &cfg_pcu_dl_arq_cmd);
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +01001229 install_element(PCU_NODE, &cfg_pcu_no_mcs_cmd);
Jacob Erlbeck0d058052016-01-07 11:48:28 +01001230 install_element(PCU_NODE, &cfg_pcu_mcs_max_cmd);
1231 install_element(PCU_NODE, &cfg_pcu_no_mcs_max_cmd);
Jacob Erlbeck36df7742016-01-19 15:53:30 +01001232 install_element(PCU_NODE, &cfg_pcu_window_size_cmd);
Andreas Eversberg24131bf2012-07-21 11:09:58 +02001233 install_element(PCU_NODE, &cfg_pcu_queue_lifetime_cmd);
1234 install_element(PCU_NODE, &cfg_pcu_queue_lifetime_inf_cmd);
1235 install_element(PCU_NODE, &cfg_pcu_no_queue_lifetime_cmd);
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +01001236 install_element(PCU_NODE, &cfg_pcu_queue_hysteresis_cmd);
1237 install_element(PCU_NODE, &cfg_pcu_no_queue_hysteresis_cmd);
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +02001238 install_element(PCU_NODE, &cfg_pcu_queue_codel_cmd);
1239 install_element(PCU_NODE, &cfg_pcu_queue_codel_interval_cmd);
1240 install_element(PCU_NODE, &cfg_pcu_no_queue_codel_cmd);
Jacob Erlbeckd0261b72015-04-02 13:58:09 +02001241 install_element(PCU_NODE, &cfg_pcu_queue_idle_ack_delay_cmd);
1242 install_element(PCU_NODE, &cfg_pcu_no_queue_idle_ack_delay_cmd);
Andreas Eversberga1503fa2012-07-22 08:58:09 +02001243 install_element(PCU_NODE, &cfg_pcu_alloc_cmd);
Andreas Eversberg07e97cf2012-08-07 16:00:56 +02001244 install_element(PCU_NODE, &cfg_pcu_two_phase_cmd);
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +02001245 install_element(PCU_NODE, &cfg_pcu_fc_interval_cmd);
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +02001246 install_element(PCU_NODE, &cfg_pcu_fc_bucket_time_cmd);
1247 install_element(PCU_NODE, &cfg_pcu_no_fc_bucket_time_cmd);
Jacob Erlbeck87d73412015-04-21 12:56:48 +02001248 install_element(PCU_NODE, &cfg_pcu_fc_bvc_bucket_size_cmd);
1249 install_element(PCU_NODE, &cfg_pcu_no_fc_bvc_bucket_size_cmd);
1250 install_element(PCU_NODE, &cfg_pcu_fc_bvc_leak_rate_cmd);
1251 install_element(PCU_NODE, &cfg_pcu_no_fc_bvc_leak_rate_cmd);
1252 install_element(PCU_NODE, &cfg_pcu_fc_ms_bucket_size_cmd);
1253 install_element(PCU_NODE, &cfg_pcu_no_fc_ms_bucket_size_cmd);
1254 install_element(PCU_NODE, &cfg_pcu_fc_ms_leak_rate_cmd);
1255 install_element(PCU_NODE, &cfg_pcu_no_fc_ms_leak_rate_cmd);
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +02001256 install_element(PCU_NODE, &cfg_pcu_alpha_cmd);
1257 install_element(PCU_NODE, &cfg_pcu_gamma_cmd);
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +01001258 install_element(PCU_NODE, &cfg_pcu_dl_tbf_idle_time_cmd);
1259 install_element(PCU_NODE, &cfg_pcu_no_dl_tbf_idle_time_cmd);
Oliver Smith45fdc442019-09-05 15:12:20 +02001260 install_element(PCU_NODE, &cfg_pcu_dl_tbf_preemptive_retransmission_cmd);
1261 install_element(PCU_NODE, &cfg_pcu_no_dl_tbf_preemptive_retransmission_cmd);
Jacob Erlbecka098c192015-05-28 16:11:19 +02001262 install_element(PCU_NODE, &cfg_pcu_ms_idle_time_cmd);
1263 install_element(PCU_NODE, &cfg_pcu_no_ms_idle_time_cmd);
Harald Welte717cdf52017-07-21 21:56:23 +02001264 install_element(PCU_NODE, &cfg_pcu_gsmtap_categ_cmd);
1265 install_element(PCU_NODE, &cfg_pcu_no_gsmtap_categ_cmd);
Pau Espin Pedrolc4178e52017-08-08 15:03:50 +02001266 install_element(PCU_NODE, &cfg_pcu_sock_cmd);
Harald Welte57d35152018-07-05 03:11:17 +02001267 install_element(PCU_NODE, &cfg_pcu_gb_dialect_cmd);
Pau Espin Pedrolc0a250d2021-01-21 18:46:13 +01001268 install_element(PCU_NODE, &cfg_neighbor_resolution_cmd);
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +02001269 install_element(PCU_NODE, &cfg_pcu_timer_cmd);
Andreas Eversberg8b761a32012-07-20 21:50:31 +02001270
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +01001271 install_element_ve(&show_bts_stats_cmd);
Pau Espin Pedrola1ac2f02020-09-22 17:01:31 +02001272 install_element_ve(&show_bts_pdch_cmd);
Daniel Willmann772415f2014-01-15 17:06:51 +01001273 install_element_ve(&show_tbf_cmd);
Jacob Erlbeckf47f68a2015-06-04 10:23:24 +02001274 install_element_ve(&show_ms_all_cmd);
Jacob Erlbeck37e896d2015-06-05 16:33:33 +02001275 install_element_ve(&show_ms_tlli_cmd);
1276 install_element_ve(&show_ms_imsi_cmd);
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +02001277 install_element_ve(&show_bts_timer_cmd);
1278 install_element_ve(&show_timer_cmd);
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +01001279
Andreas Eversberg12942562012-07-12 14:31:57 +02001280 return 0;
1281}