blob: 1ca63761f80deefca6ef4d7c9da3a3b74cf27d27 [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++) {
Pau Espin Pedrol56f223d2021-03-24 14:26:39 +0100242 uint32_t cs = ((uint32_t)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
Harald Welted9367e32021-04-29 22:02:47 +0200254 if (the_pcu->vty.ns_ip_dscp != -1)
255 vty_out(vty, " gb ip-dscp %d%s", the_pcu->vty.ns_ip_dscp, VTY_NEWLINE);
256 if (the_pcu->vty.ns_priority != -1)
257 vty_out(vty, " gb socket-priority %d%s", the_pcu->vty.ns_priority, VTY_NEWLINE);
258
Pau Espin Pedrol66e8a492021-02-17 20:24:59 +0100259 if (the_pcu->vty.neigh_ctrl_addr) {
260 vty_out(vty, " neighbor resolution %s %u%s",
261 the_pcu->vty.neigh_ctrl_addr, the_pcu->vty.neigh_ctrl_port, VTY_NEWLINE);
262 }
263
Pau Espin Pedrol924aaad2021-01-14 12:01:42 +0100264 osmo_tdef_vty_write(vty, the_pcu->T_defs, " timer ");
Pau Espin Pedrol18794422019-09-26 18:25:35 +0200265
Maxc9ce6f92018-01-30 17:53:02 +0100266 return CMD_SUCCESS;
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200267}
268
269/* per-BTS configuration */
Philipp Maier9459ebd2020-09-29 23:31:33 +0200270DEFUN_ATTR(cfg_pcu,
271 cfg_pcu_cmd,
272 "pcu",
273 "BTS specific configure",
274 CMD_ATTR_IMMEDIATE)
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200275{
276 vty->node = PCU_NODE;
277
278 return CMD_SUCCESS;
279}
280
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200281#define EGPRS_STR "EGPRS configuration\n"
282
Pau Espin Pedrol270c9ea2020-10-30 17:15:32 +0100283DEFUN_DEPRECATED(cfg_pcu_egprs,
284 cfg_pcu_egprs_cmd,
285 "egprs only",
286 EGPRS_STR "Use EGPRS and disable plain GPRS\n")
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200287{
Pau Espin Pedrol270c9ea2020-10-30 17:15:32 +0100288 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 +0200289 return CMD_SUCCESS;
290}
291
Pau Espin Pedrol270c9ea2020-10-30 17:15:32 +0100292DEFUN_DEPRECATED(cfg_pcu_no_egprs,
293 cfg_pcu_no_egprs_cmd,
294 "no egprs",
295 NO_STR EGPRS_STR)
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200296{
Pau Espin Pedrol270c9ea2020-10-30 17:15:32 +0100297 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 +0200298 return CMD_SUCCESS;
299}
300
Philipp Maier9459ebd2020-09-29 23:31:33 +0200301DEFUN_ATTR(cfg_pcu_fc_interval,
302 cfg_pcu_fc_interval_cmd,
303 "flow-control-interval <1-10>",
304 "Interval between sending subsequent Flow Control PDUs\n"
305 "Interval time in seconds\n",
306 CMD_ATTR_IMMEDIATE)
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200307{
Pau Espin Pedrole8912222021-01-14 14:03:17 +0100308 the_pcu->vty.fc_interval = atoi(argv[0]);
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200309 return CMD_SUCCESS;
310}
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200311#define FC_STR "BSSGP Flow Control configuration\n"
312#define FC_BMAX_STR(who) "Force a fixed value for the " who " bucket size\n"
313#define FC_LR_STR(who) "Force a fixed value for the " who " leak rate\n"
314
Philipp Maier9459ebd2020-09-29 23:31:33 +0200315DEFUN_ATTR(cfg_pcu_fc_bvc_bucket_size,
316 cfg_pcu_fc_bvc_bucket_size_cmd,
317 "flow-control force-bvc-bucket-size <1-6553500>",
318 FC_STR FC_BMAX_STR("BVC") "Bucket size in octets\n",
319 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200320{
Pau Espin Pedrole8912222021-01-14 14:03:17 +0100321 the_pcu->vty.fc_bvc_bucket_size = atoi(argv[0]);
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200322 return CMD_SUCCESS;
323}
324
Philipp Maier9459ebd2020-09-29 23:31:33 +0200325DEFUN_ATTR(cfg_pcu_no_fc_bvc_bucket_size,
326 cfg_pcu_no_fc_bvc_bucket_size_cmd,
327 "no flow-control force-bvc-bucket-size",
328 NO_STR FC_STR FC_BMAX_STR("BVC"),
329 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200330{
Pau Espin Pedrole8912222021-01-14 14:03:17 +0100331 the_pcu->vty.fc_bvc_bucket_size = 0;
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200332 return CMD_SUCCESS;
333}
334
Philipp Maier9459ebd2020-09-29 23:31:33 +0200335DEFUN_ATTR(cfg_pcu_fc_bvc_leak_rate,
336 cfg_pcu_fc_bvc_leak_rate_cmd,
337 "flow-control force-bvc-leak-rate <1-6553500>",
338 FC_STR FC_LR_STR("BVC") "Leak rate in bit/s\n",
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 = atoi(argv[0]);
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200342
343 return CMD_SUCCESS;
344}
345
Philipp Maier9459ebd2020-09-29 23:31:33 +0200346DEFUN_ATTR(cfg_pcu_no_fc_bvc_leak_rate,
347 cfg_pcu_no_fc_bvc_leak_rate_cmd,
348 "no flow-control force-bvc-leak-rate",
349 NO_STR FC_STR FC_LR_STR("BVC"),
350 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200351{
Pau Espin Pedrole8912222021-01-14 14:03:17 +0100352 the_pcu->vty.fc_bvc_leak_rate = 0;
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200353 return CMD_SUCCESS;
354}
355
Philipp Maier9459ebd2020-09-29 23:31:33 +0200356DEFUN_ATTR(cfg_pcu_fc_ms_bucket_size,
357 cfg_pcu_fc_ms_bucket_size_cmd,
358 "flow-control force-ms-bucket-size <1-6553500>",
359 FC_STR FC_BMAX_STR("default MS") "Bucket size in octets\n",
360 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200361{
Pau Espin Pedrole8912222021-01-14 14:03:17 +0100362 the_pcu->vty.fc_ms_bucket_size = atoi(argv[0]);
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200363 return CMD_SUCCESS;
364}
365
Philipp Maier9459ebd2020-09-29 23:31:33 +0200366DEFUN_ATTR(cfg_pcu_no_fc_ms_bucket_size,
367 cfg_pcu_no_fc_ms_bucket_size_cmd,
368 "no flow-control force-ms-bucket-size",
369 NO_STR FC_STR FC_BMAX_STR("default MS"),
370 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200371{
Pau Espin Pedrole8912222021-01-14 14:03:17 +0100372 the_pcu->vty.fc_ms_bucket_size = 0;
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200373 return CMD_SUCCESS;
374}
375
Philipp Maier9459ebd2020-09-29 23:31:33 +0200376DEFUN_ATTR(cfg_pcu_fc_ms_leak_rate,
377 cfg_pcu_fc_ms_leak_rate_cmd,
378 "flow-control force-ms-leak-rate <1-6553500>",
379 FC_STR FC_LR_STR("default MS") "Leak rate in bit/s\n",
380 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200381{
Pau Espin Pedrole8912222021-01-14 14:03:17 +0100382 the_pcu->vty.fc_ms_leak_rate = atoi(argv[0]);
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200383 return CMD_SUCCESS;
384}
385
Philipp Maier9459ebd2020-09-29 23:31:33 +0200386DEFUN_ATTR(cfg_pcu_no_fc_ms_leak_rate,
387 cfg_pcu_no_fc_ms_leak_rate_cmd,
388 "no flow-control force-ms-leak-rate",
389 NO_STR FC_STR FC_LR_STR("default MS"),
390 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200391{
Pau Espin Pedrole8912222021-01-14 14:03:17 +0100392 the_pcu->vty.fc_ms_leak_rate = 0;
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200393 return CMD_SUCCESS;
394}
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200395
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200396#define FC_BTIME_STR "Set target downlink maximum queueing time (only affects the advertised bucket size)\n"
Philipp Maier9459ebd2020-09-29 23:31:33 +0200397DEFUN_ATTR(cfg_pcu_fc_bucket_time,
398 cfg_pcu_fc_bucket_time_cmd,
399 "flow-control bucket-time <1-65534>",
400 FC_STR FC_BTIME_STR "Time in centi-seconds\n",
401 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200402{
Pau Espin Pedrole8912222021-01-14 14:03:17 +0100403 the_pcu->vty.fc_bucket_time = atoi(argv[0]);
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200404 return CMD_SUCCESS;
405}
406
Philipp Maier9459ebd2020-09-29 23:31:33 +0200407DEFUN_ATTR(cfg_pcu_no_fc_bucket_time,
408 cfg_pcu_no_fc_bucket_time_cmd,
409 "no flow-control bucket-time",
410 NO_STR FC_STR FC_BTIME_STR,
411 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200412{
Pau Espin Pedrole8912222021-01-14 14:03:17 +0100413 the_pcu->vty.fc_bucket_time = 0;
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200414 return CMD_SUCCESS;
415}
416
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200417#define CS_STR "Coding Scheme configuration\n"
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200418
Philipp Maier9459ebd2020-09-29 23:31:33 +0200419DEFUN_ATTR(cfg_pcu_cs,
420 cfg_pcu_cs_cmd,
421 "cs <1-4> [<1-4>]",
422 CS_STR
423 "Initial CS value to be used (overrides BTS config)\n"
424 "Use a different initial CS value for the uplink",
425 CMD_ATTR_IMMEDIATE)
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200426{
Pau Espin Pedrol793583e2021-01-14 16:20:57 +0100427 uint8_t cs_dl, cs_ul;
428 cs_dl = atoi(argv[0]);
Andreas Eversberg499ff412012-10-03 14:21:36 +0200429 if (argc > 1)
Pau Espin Pedrol793583e2021-01-14 16:20:57 +0100430 cs_ul = atoi(argv[1]);
Andreas Eversberg499ff412012-10-03 14:21:36 +0200431 else
Pau Espin Pedrol793583e2021-01-14 16:20:57 +0100432 cs_ul = cs_dl;
433 the_pcu->vty.force_initial_cs = true;
434 gprs_pcu_set_initial_cs(the_pcu, cs_dl, cs_ul);
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200435 return CMD_SUCCESS;
436}
437
Philipp Maier9459ebd2020-09-29 23:31:33 +0200438DEFUN_ATTR(cfg_pcu_no_cs,
439 cfg_pcu_no_cs_cmd,
440 "no cs",
441 NO_STR CS_STR,
442 CMD_ATTR_IMMEDIATE)
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200443{
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100444 the_pcu->vty.force_initial_cs = false;
Pau Espin Pedrol793583e2021-01-14 16:20:57 +0100445 gprs_pcu_set_initial_cs(the_pcu, 0, 0);
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200446 return CMD_SUCCESS;
447}
448
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100449#define CS_MAX_STR "Set maximum values for adaptive CS selection (overrides BTS config)\n"
Philipp Maier9459ebd2020-09-29 23:31:33 +0200450DEFUN_ATTR(cfg_pcu_cs_max,
451 cfg_pcu_cs_max_cmd,
452 "cs max <1-4> [<1-4>]",
453 CS_STR
454 CS_MAX_STR
455 "Maximum CS value to be used\n"
456 "Use a different maximum CS value for the uplink",
457 CMD_ATTR_IMMEDIATE)
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200458{
Pau Espin Pedrol343ec9b2020-10-30 18:35:54 +0100459 uint8_t cs_dl = atoi(argv[0]);
460 uint8_t cs_ul;
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200461
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200462 if (argc > 1)
Pau Espin Pedrol343ec9b2020-10-30 18:35:54 +0100463 cs_ul = atoi(argv[1]);
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200464 else
Pau Espin Pedrol343ec9b2020-10-30 18:35:54 +0100465 cs_ul = cs_dl;
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200466
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100467 gprs_pcu_set_max_cs(the_pcu, cs_dl, cs_ul);
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200468 return CMD_SUCCESS;
469}
470
Philipp Maier9459ebd2020-09-29 23:31:33 +0200471DEFUN_ATTR(cfg_pcu_no_cs_max,
472 cfg_pcu_no_cs_max_cmd,
473 "no cs max",
474 NO_STR CS_STR CS_MAX_STR,
475 CMD_ATTR_IMMEDIATE)
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200476{
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100477 gprs_pcu_set_max_cs(the_pcu, 0, 0);
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200478 return CMD_SUCCESS;
479}
480
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100481#define MCS_STR "Modulation and Coding Scheme configuration (EGPRS)\n"
Philipp Maier9459ebd2020-09-29 23:31:33 +0200482DEFUN_ATTR(cfg_pcu_mcs,
483 cfg_pcu_mcs_cmd,
484 "mcs <1-9> [<1-9>]",
485 MCS_STR
486 "Initial MCS value to be used (default 1)\n"
487 "Use a different initial MCS value for the uplink",
488 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +0100489{
Pau Espin Pedrol793583e2021-01-14 16:20:57 +0100490 uint8_t mcs_dl, mcs_ul;
491 mcs_dl = atoi(argv[0]);
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +0100492 if (argc > 1)
Pau Espin Pedrol793583e2021-01-14 16:20:57 +0100493 mcs_ul = atoi(argv[1]);
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +0100494 else
Pau Espin Pedrol793583e2021-01-14 16:20:57 +0100495 mcs_ul = mcs_dl;
496 the_pcu->vty.force_initial_mcs = true;
497 gprs_pcu_set_initial_mcs(the_pcu, mcs_dl, mcs_ul);
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +0100498 return CMD_SUCCESS;
499}
500
Philipp Maier9459ebd2020-09-29 23:31:33 +0200501DEFUN_ATTR(cfg_pcu_no_mcs,
502 cfg_pcu_no_mcs_cmd,
503 "no mcs",
504 NO_STR MCS_STR,
505 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +0100506{
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100507 the_pcu->vty.force_initial_mcs = false;
Pau Espin Pedrol793583e2021-01-14 16:20:57 +0100508 gprs_pcu_set_initial_mcs(the_pcu, 0, 0);
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +0100509 return CMD_SUCCESS;
510}
511
Philipp Maier9459ebd2020-09-29 23:31:33 +0200512DEFUN_ATTR(cfg_pcu_mcs_max,
513 cfg_pcu_mcs_max_cmd,
514 "mcs max <1-9> [<1-9>]",
515 MCS_STR
516 CS_MAX_STR
517 "Maximum MCS value to be used\n"
518 "Use a different maximum MCS value for the uplink",
519 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100520{
Pau Espin Pedrol343ec9b2020-10-30 18:35:54 +0100521 uint8_t mcs_dl = atoi(argv[0]);
522 uint8_t mcs_ul;
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100523
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100524 if (argc > 1)
Pau Espin Pedrol343ec9b2020-10-30 18:35:54 +0100525 mcs_ul = atoi(argv[1]);
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100526 else
Pau Espin Pedrol343ec9b2020-10-30 18:35:54 +0100527 mcs_ul = mcs_dl;
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100528
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100529 gprs_pcu_set_max_mcs(the_pcu, mcs_dl, mcs_ul);
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100530 return CMD_SUCCESS;
531}
532
Philipp Maier9459ebd2020-09-29 23:31:33 +0200533DEFUN_ATTR(cfg_pcu_no_mcs_max,
534 cfg_pcu_no_mcs_max_cmd,
535 "no mcs max",
536 NO_STR MCS_STR CS_MAX_STR,
537 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100538{
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100539 gprs_pcu_set_max_mcs(the_pcu, 0, 0);
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100540 return CMD_SUCCESS;
541}
542
Aravind Sirsikar50b09702016-08-22 17:21:10 +0530543#define DL_STR "downlink specific configuration\n"
544
Philipp Maier9459ebd2020-09-29 23:31:33 +0200545DEFUN_ATTR(cfg_pcu_dl_arq_type,
546 cfg_pcu_dl_arq_cmd,
547 "egprs dl arq-type (spb|arq2)",
548 EGPRS_STR DL_STR "ARQ options\n"
549 "enable SPB(ARQ1) support\n"
550 "enable ARQ2 support",
551 CMD_ATTR_IMMEDIATE)
Aravind Sirsikar50b09702016-08-22 17:21:10 +0530552{
Aravind Sirsikar50b09702016-08-22 17:21:10 +0530553 if (!strcmp(argv[0], "arq2"))
Pau Espin Pedrol97296b22021-01-14 13:08:02 +0100554 the_pcu->vty.dl_arq_type = EGPRS_ARQ2;
Aravind Sirsikar50b09702016-08-22 17:21:10 +0530555 else
Pau Espin Pedrol97296b22021-01-14 13:08:02 +0100556 the_pcu->vty.dl_arq_type = EGPRS_ARQ1;
Aravind Sirsikar50b09702016-08-22 17:21:10 +0530557
558 return CMD_SUCCESS;
559}
560
Philipp Maier9459ebd2020-09-29 23:31:33 +0200561DEFUN_USRATTR(cfg_pcu_window_size,
562 cfg_pcu_window_size_cmd,
563 X(PCU_VTY_ATTR_NEW_TBF),
564 "window-size <0-1024> [<0-256>]",
565 "Window size configuration (b + N_PDCH * f)\n"
566 "Base value (b)\n"
567 "Factor for number of PDCH (f)")
Jacob Erlbeck36df7742016-01-19 15:53:30 +0100568{
Jacob Erlbeck36df7742016-01-19 15:53:30 +0100569 uint16_t b = atoi(argv[0]);
570
Pau Espin Pedrol519d0712021-01-14 14:30:03 +0100571 the_pcu->vty.ws_base = b;
Jacob Erlbeck36df7742016-01-19 15:53:30 +0100572 if (argc > 1) {
573 uint16_t f = atoi(argv[1]);
Pau Espin Pedrol519d0712021-01-14 14:30:03 +0100574 the_pcu->vty.ws_pdch = f;
Jacob Erlbeck36df7742016-01-19 15:53:30 +0100575 }
576
577 return CMD_SUCCESS;
578}
579
580
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200581#define QUEUE_STR "Packet queue options\n"
582#define LIFETIME_STR "Set lifetime limit of LLC frame in centi-seconds " \
583 "(overrides the value given by SGSN)\n"
584
Philipp Maier9459ebd2020-09-29 23:31:33 +0200585DEFUN_USRATTR(cfg_pcu_queue_lifetime,
586 cfg_pcu_queue_lifetime_cmd,
587 X(PCU_VTY_ATTR_NEW_TBF),
588 "queue lifetime <1-65534>",
589 QUEUE_STR LIFETIME_STR "Lifetime in centi-seconds")
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200590{
Jacob Erlbeck2acfbeb2015-04-30 17:55:16 +0200591 uint16_t csec = atoi(argv[0]);
Pau Espin Pedrolf473ec92021-01-14 14:45:14 +0100592 the_pcu->vty.force_llc_lifetime = csec;
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200593 return CMD_SUCCESS;
594}
595
Philipp Maier9459ebd2020-09-29 23:31:33 +0200596DEFUN_USRATTR(cfg_pcu_queue_lifetime_inf,
597 cfg_pcu_queue_lifetime_inf_cmd,
598 X(PCU_VTY_ATTR_NEW_TBF),
599 "queue lifetime infinite",
600 QUEUE_STR LIFETIME_STR "Infinite lifetime")
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200601{
Pau Espin Pedrolf473ec92021-01-14 14:45:14 +0100602 the_pcu->vty.force_llc_lifetime = 0xffff;
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200603 return CMD_SUCCESS;
604}
605
Philipp Maier9459ebd2020-09-29 23:31:33 +0200606DEFUN_USRATTR(cfg_pcu_no_queue_lifetime,
607 cfg_pcu_no_queue_lifetime_cmd,
608 X(PCU_VTY_ATTR_NEW_TBF),
609 "no queue lifetime",
610 NO_STR QUEUE_STR "Disable lifetime limit of LLC frame (use value given "
611 "by SGSN)\n")
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200612{
Pau Espin Pedrolf473ec92021-01-14 14:45:14 +0100613 the_pcu->vty.force_llc_lifetime = 0;
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200614 return CMD_SUCCESS;
615}
616
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100617#define QUEUE_HYSTERESIS_STR "Set lifetime hysteresis of LLC frame in centi-seconds " \
618 "(continue discarding until lifetime-hysteresis is reached)\n"
619
Philipp Maier9459ebd2020-09-29 23:31:33 +0200620DEFUN_USRATTR(cfg_pcu_queue_hysteresis,
621 cfg_pcu_queue_hysteresis_cmd,
622 X(PCU_VTY_ATTR_NEW_TBF),
623 "queue hysteresis <1-65535>",
624 QUEUE_STR QUEUE_HYSTERESIS_STR "Hysteresis in centi-seconds")
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100625{
Jacob Erlbeck2acfbeb2015-04-30 17:55:16 +0200626 uint16_t csec = atoi(argv[0]);
Pau Espin Pedrolf473ec92021-01-14 14:45:14 +0100627 the_pcu->vty.llc_discard_csec = csec;
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100628 return CMD_SUCCESS;
629}
630
Philipp Maier9459ebd2020-09-29 23:31:33 +0200631DEFUN_USRATTR(cfg_pcu_no_queue_hysteresis,
632 cfg_pcu_no_queue_hysteresis_cmd,
633 X(PCU_VTY_ATTR_NEW_TBF),
634 "no queue hysteresis",
635 NO_STR QUEUE_STR QUEUE_HYSTERESIS_STR)
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100636{
Pau Espin Pedrolf473ec92021-01-14 14:45:14 +0100637 the_pcu->vty.llc_discard_csec = 0;
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100638 return CMD_SUCCESS;
639}
640
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200641#define QUEUE_CODEL_STR "Set CoDel queue management\n"
Philipp Maier9459ebd2020-09-29 23:31:33 +0200642DEFUN_USRATTR(cfg_pcu_queue_codel,
643 cfg_pcu_queue_codel_cmd,
644 X(PCU_VTY_ATTR_NEW_SUBSCR),
645 "queue codel",
646 QUEUE_STR QUEUE_CODEL_STR)
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200647{
Pau Espin Pedrolf473ec92021-01-14 14:45:14 +0100648 the_pcu->vty.llc_codel_interval_msec = LLC_CODEL_USE_DEFAULT;
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200649 return CMD_SUCCESS;
650}
651
Philipp Maier9459ebd2020-09-29 23:31:33 +0200652DEFUN_USRATTR(cfg_pcu_queue_codel_interval,
653 cfg_pcu_queue_codel_interval_cmd,
654 X(PCU_VTY_ATTR_NEW_SUBSCR),
655 "queue codel interval <1-1000>",
656 QUEUE_STR QUEUE_CODEL_STR "Specify interval\n" "Interval in centi-seconds")
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200657{
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200658 uint16_t csec = atoi(argv[0]);
Pau Espin Pedrolf473ec92021-01-14 14:45:14 +0100659 the_pcu->vty.llc_codel_interval_msec = 10*csec;
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200660 return CMD_SUCCESS;
661}
662
Philipp Maier9459ebd2020-09-29 23:31:33 +0200663DEFUN_USRATTR(cfg_pcu_no_queue_codel,
664 cfg_pcu_no_queue_codel_cmd,
665 X(PCU_VTY_ATTR_NEW_SUBSCR),
666 "no queue codel",
667 NO_STR QUEUE_STR QUEUE_CODEL_STR)
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200668{
Pau Espin Pedrolf473ec92021-01-14 14:45:14 +0100669 the_pcu->vty.llc_codel_interval_msec = LLC_CODEL_DISABLE;
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200670 return CMD_SUCCESS;
671}
672
673
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200674#define QUEUE_IDLE_ACK_STR "Request an ACK after the last DL LLC frame in centi-seconds\n"
675
Philipp Maier9459ebd2020-09-29 23:31:33 +0200676DEFUN_ATTR(cfg_pcu_queue_idle_ack_delay,
677 cfg_pcu_queue_idle_ack_delay_cmd,
678 "queue idle-ack-delay <1-65535>",
679 QUEUE_STR QUEUE_IDLE_ACK_STR "Idle ACK delay in centi-seconds",
680 CMD_ATTR_IMMEDIATE)
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200681{
Jacob Erlbeck2acfbeb2015-04-30 17:55:16 +0200682 uint16_t csec = atoi(argv[0]);
Pau Espin Pedrolf473ec92021-01-14 14:45:14 +0100683 the_pcu->vty.llc_idle_ack_csec = csec;
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200684 return CMD_SUCCESS;
685}
686
Philipp Maier9459ebd2020-09-29 23:31:33 +0200687DEFUN_ATTR(cfg_pcu_no_queue_idle_ack_delay,
688 cfg_pcu_no_queue_idle_ack_delay_cmd,
689 "no queue idle-ack-delay",
690 NO_STR QUEUE_STR QUEUE_IDLE_ACK_STR,
691 CMD_ATTR_IMMEDIATE)
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200692{
Pau Espin Pedrolf473ec92021-01-14 14:45:14 +0100693 the_pcu->vty.llc_idle_ack_csec = 0;
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200694 return CMD_SUCCESS;
695}
696
Philipp Maier9459ebd2020-09-29 23:31:33 +0200697DEFUN_ATTR(cfg_pcu_alloc,
698 cfg_pcu_alloc_cmd,
699 "alloc-algorithm (a|b|dynamic)",
700 "Select slot allocation algorithm to use when assigning timeslots on "
701 "PACCH\n"
702 "Single slot is assigned only\n"
703 "Multiple slots are assigned for semi-duplex operation\n"
704 "Dynamically select the algorithm based on the system state\n",
705 CMD_ATTR_IMMEDIATE)
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200706{
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200707 switch (argv[0][0]) {
708 case 'a':
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100709 the_pcu->alloc_algorithm = alloc_algorithm_a;
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200710 break;
711 case 'b':
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100712 the_pcu->alloc_algorithm = alloc_algorithm_b;
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200713 break;
Jacob Erlbeck400ec022015-07-14 13:31:48 +0200714 default:
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100715 the_pcu->alloc_algorithm = alloc_algorithm_dynamic;
Jacob Erlbeck400ec022015-07-14 13:31:48 +0200716 break;
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200717 }
718
719 return CMD_SUCCESS;
720}
721
Philipp Maier9459ebd2020-09-29 23:31:33 +0200722DEFUN_ATTR(cfg_pcu_two_phase,
723 cfg_pcu_two_phase_cmd,
724 "two-phase-access",
725 "Force two phase access when MS requests single phase access\n",
726 CMD_ATTR_IMMEDIATE)
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200727{
Pau Espin Pedrol03de8982021-01-14 12:48:50 +0100728 the_pcu->vty.force_two_phase = 1;
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200729 return CMD_SUCCESS;
730}
731
Philipp Maier9459ebd2020-09-29 23:31:33 +0200732DEFUN_ATTR(cfg_pcu_no_two_phase,
733 cfg_pcu_no_two_phase_cmd,
734 "no two-phase-access",
735 NO_STR "Only use two phase access when requested my MS\n",
736 CMD_ATTR_IMMEDIATE)
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200737{
Pau Espin Pedrol03de8982021-01-14 12:48:50 +0100738 the_pcu->vty.force_two_phase = 0;
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200739 return CMD_SUCCESS;
740}
741
Philipp Maier9459ebd2020-09-29 23:31:33 +0200742DEFUN_ATTR(cfg_pcu_alpha,
743 cfg_pcu_alpha_cmd,
Pau Espin Pedrolfe8de452021-02-09 18:47:34 +0100744 "alpha (si13|<0-10>)",
Philipp Maier9459ebd2020-09-29 23:31:33 +0200745 "Alpha parameter for MS power control in units of 0.1 (see TS 05.08) "
746 "NOTE: Be sure to set Alpha value at System information 13 too.\n"
Pau Espin Pedrolfe8de452021-02-09 18:47:34 +0100747 "Use value received from BSC in System Intormation 13 (default)\n"
748 "Force Alpha in units of 0.1\n",
749 CMD_ATTR_IMMEDIATE | CMD_ATTR_DEPRECATED)
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200750{
Pau Espin Pedrolfe8de452021-02-09 18:47:34 +0100751 vty_out(vty, "%% 'alpha <0-10>' is now deprecated: use osmo-bsc's 'gprs power-control alpha <0-10>' instead%s",
752 VTY_NEWLINE);
753 if (strcmp(argv[0], "si13") == 0)
754 the_pcu->vty.force_alpha = (uint8_t) -1;
755 else
756 the_pcu->vty.force_alpha = atoi(argv[0]);
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200757 return CMD_SUCCESS;
758}
759
Philipp Maier9459ebd2020-09-29 23:31:33 +0200760DEFUN_ATTR(cfg_pcu_gamma,
761 cfg_pcu_gamma_cmd,
762 "gamma <0-62>",
763 "Gamma parameter for MS power control in units of dB (see TS 05.08)\n"
764 "Gamma in even unit of dBs\n",
765 CMD_ATTR_IMMEDIATE)
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200766{
Pau Espin Pedrola2814952021-01-14 12:53:53 +0100767 the_pcu->vty.gamma = atoi(argv[0]) / 2;
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200768 return CMD_SUCCESS;
769}
770
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +0100771DEFUN(show_bts_stats,
772 show_bts_stats_cmd,
773 "show bts statistics",
774 SHOW_STR "BTS related functionality\nStatistics\n")
775{
Pau Espin Pedrold1049dc2021-01-18 17:14:14 +0100776 struct gprs_rlcmac_bts *bts;
777 llist_for_each_entry(bts, &the_pcu->bts_list, list) {
778 vty_out(vty, "BTS%" PRIu8 ":%s", bts->nr, VTY_NEWLINE);
779 vty_out_rate_ctr_group(vty, " ", bts_rate_counters(bts));
780 }
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +0100781 return CMD_SUCCESS;
Daniel Willmann772415f2014-01-15 17:06:51 +0100782}
783
Pau Espin Pedrola1ac2f02020-09-22 17:01:31 +0200784DEFUN(show_bts_pdch,
785 show_bts_pdch_cmd,
786 "show bts pdch",
787 SHOW_STR "BTS related functionality\nPDCH timeslots\n")
788{
Pau Espin Pedrold1049dc2021-01-18 17:14:14 +0100789 struct gprs_rlcmac_bts *bts;
790 llist_for_each_entry(bts, &the_pcu->bts_list, list) {
791 pcu_vty_show_bts_pdch(vty, bts);
792 }
793 return CMD_SUCCESS;
Pau Espin Pedrola1ac2f02020-09-22 17:01:31 +0200794}
795
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100796#define IDLE_TIME_STR "keep an idle DL TBF alive for the time given\n"
Pau Espin Pedrol2b5c6292019-09-09 13:41:00 +0200797DEFUN_DEPRECATED(cfg_pcu_dl_tbf_idle_time,
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100798 cfg_pcu_dl_tbf_idle_time_cmd,
799 "dl-tbf-idle-time <1-5000>",
800 IDLE_TIME_STR "idle time in msec")
801{
Pau Espin Pedrol2b5c6292019-09-09 13:41:00 +0200802 vty_out(vty, "%% 'dl-tbf-idle-time' is now deprecated: use 'timer X2031 <val>' instead%s", VTY_NEWLINE);
803
Pau Espin Pedrol924aaad2021-01-14 12:01:42 +0100804 if (osmo_tdef_set(the_pcu->T_defs, -2031, atoi(argv[0]), OSMO_TDEF_MS) < 0)
Pau Espin Pedrol2b5c6292019-09-09 13:41:00 +0200805 return CMD_WARNING;
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100806 return CMD_SUCCESS;
807}
808
Pau Espin Pedrol2b5c6292019-09-09 13:41:00 +0200809DEFUN_DEPRECATED(cfg_pcu_no_dl_tbf_idle_time,
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100810 cfg_pcu_no_dl_tbf_idle_time_cmd,
811 "no dl-tbf-idle-time",
812 NO_STR IDLE_TIME_STR)
813{
Pau Espin Pedrol2b5c6292019-09-09 13:41:00 +0200814 vty_out(vty, "%% 'no dl-tbf-idle-time' is now deprecated: use 'timer X2031 0' instead%s", VTY_NEWLINE);
815
Pau Espin Pedrol924aaad2021-01-14 12:01:42 +0100816 if (osmo_tdef_set(the_pcu->T_defs, -2031, 0, OSMO_TDEF_MS) < 0)
Pau Espin Pedrol2b5c6292019-09-09 13:41:00 +0200817 return CMD_WARNING;
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100818 return CMD_SUCCESS;
819}
820
Oliver Smith45fdc442019-09-05 15:12:20 +0200821#define RETRANSMISSION_STR "retransmit blocks even before the MS had a chance to receive them (better throughput," \
822 " less readable traces)"
Philipp Maier9459ebd2020-09-29 23:31:33 +0200823DEFUN_ATTR(cfg_pcu_dl_tbf_preemptive_retransmission,
824 cfg_pcu_dl_tbf_preemptive_retransmission_cmd,
825 "dl-tbf-preemptive-retransmission",
826 RETRANSMISSION_STR " (enabled by default)",
827 CMD_ATTR_IMMEDIATE)
Oliver Smith45fdc442019-09-05 15:12:20 +0200828{
Pau Espin Pedrol05f9f592021-01-14 12:56:58 +0100829 the_pcu->vty.dl_tbf_preemptive_retransmission = true;
Oliver Smith45fdc442019-09-05 15:12:20 +0200830 return CMD_SUCCESS;
831}
832
Philipp Maier9459ebd2020-09-29 23:31:33 +0200833DEFUN_ATTR(cfg_pcu_no_dl_tbf_preemptive_retransmission,
834 cfg_pcu_no_dl_tbf_preemptive_retransmission_cmd,
835 "no dl-tbf-preemptive-retransmission",
836 NO_STR RETRANSMISSION_STR,
837 CMD_ATTR_IMMEDIATE)
Oliver Smith45fdc442019-09-05 15:12:20 +0200838{
Pau Espin Pedrol05f9f592021-01-14 12:56:58 +0100839 the_pcu->vty.dl_tbf_preemptive_retransmission = false;
Oliver Smith45fdc442019-09-05 15:12:20 +0200840 return CMD_SUCCESS;
841}
842
Jacob Erlbecka098c192015-05-28 16:11:19 +0200843#define MS_IDLE_TIME_STR "keep an idle MS object alive for the time given\n"
Pau Espin Pedrol63700ea2019-09-09 13:19:06 +0200844DEFUN_DEPRECATED(cfg_pcu_ms_idle_time,
Jacob Erlbecka098c192015-05-28 16:11:19 +0200845 cfg_pcu_ms_idle_time_cmd,
846 "ms-idle-time <1-7200>",
847 MS_IDLE_TIME_STR "idle time in sec")
848{
Pau Espin Pedrol63700ea2019-09-09 13:19:06 +0200849 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 +0100850 if (osmo_tdef_set(the_pcu->T_defs, -2030, atoi(argv[0]), OSMO_TDEF_S) < 0)
Pau Espin Pedrol63700ea2019-09-09 13:19:06 +0200851 return CMD_WARNING;
Jacob Erlbecka098c192015-05-28 16:11:19 +0200852 return CMD_SUCCESS;
853}
854
Pau Espin Pedrol63700ea2019-09-09 13:19:06 +0200855DEFUN_DEPRECATED(cfg_pcu_no_ms_idle_time,
Jacob Erlbecka098c192015-05-28 16:11:19 +0200856 cfg_pcu_no_ms_idle_time_cmd,
857 "no ms-idle-time",
858 NO_STR MS_IDLE_TIME_STR)
859{
Pau Espin Pedrol63700ea2019-09-09 13:19:06 +0200860 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 +0100861 if (osmo_tdef_set(the_pcu->T_defs, -2030, 0, OSMO_TDEF_S) < 0)
Pau Espin Pedrol63700ea2019-09-09 13:19:06 +0200862 return CMD_WARNING;
Jacob Erlbecka098c192015-05-28 16:11:19 +0200863 return CMD_SUCCESS;
864}
865
Pau Espin Pedrol1e6eb302019-11-28 17:00:44 +0100866#define CS_ERR_LIMITS_STR "set thresholds for error rate based downlink (M)CS adjustment\n"
Philipp Maier9459ebd2020-09-29 23:31:33 +0200867DEFUN_ATTR(cfg_pcu_cs_err_limits,
868 cfg_pcu_cs_err_limits_cmd,
869 "cs threshold <0-100> <0-100>",
870 CS_STR CS_ERR_LIMITS_STR "lower limit in %\n" "upper limit in %\n",
871 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200872{
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200873 uint8_t lower_limit = atoi(argv[0]);
874 uint8_t upper_limit = atoi(argv[1]);
875
876 if (lower_limit > upper_limit) {
877 vty_out(vty,
878 "The lower limit must be less than or equal to the "
879 "upper limit.%s", VTY_NEWLINE);
880 return CMD_WARNING;
881 }
882
Pau Espin Pedrole8dcf642021-01-14 13:17:01 +0100883 the_pcu->vty.cs_adj_enabled = true;
884 the_pcu->vty.cs_adj_upper_limit = upper_limit;
885 the_pcu->vty.cs_adj_lower_limit = lower_limit;
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200886
887 return CMD_SUCCESS;
888}
889
Philipp Maier9459ebd2020-09-29 23:31:33 +0200890DEFUN_ATTR(cfg_pcu_no_cs_err_limits,
891 cfg_pcu_no_cs_err_limits_cmd,
892 "no cs threshold",
893 NO_STR CS_STR CS_ERR_LIMITS_STR,
894 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200895{
Pau Espin Pedrole8dcf642021-01-14 13:17:01 +0100896 the_pcu->vty.cs_adj_enabled = false;
897 the_pcu->vty.cs_adj_upper_limit = 100;
898 the_pcu->vty.cs_adj_lower_limit = 0;
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200899
900 return CMD_SUCCESS;
901}
902
Pau Espin Pedrol1e6eb302019-11-28 17:00:44 +0100903#define CS_DOWNGRADE_STR "set threshold for data size based downlink (M)CS downgrade\n"
Philipp Maier9459ebd2020-09-29 23:31:33 +0200904DEFUN_ATTR(cfg_pcu_cs_downgrade_thrsh,
905 cfg_pcu_cs_downgrade_thrsh_cmd,
906 "cs downgrade-threshold <1-10000>",
907 CS_STR CS_DOWNGRADE_STR "downgrade if less octets left\n",
908 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +0200909{
Pau Espin Pedrolad79b852021-01-14 13:20:55 +0100910 the_pcu->vty.cs_downgrade_threshold = atoi(argv[0]);
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +0200911 return CMD_SUCCESS;
912}
913
Philipp Maier9459ebd2020-09-29 23:31:33 +0200914DEFUN_ATTR(cfg_pcu_no_cs_downgrade_thrsh,
915 cfg_pcu_no_cs_downgrade_thrsh_cmd,
916 "no cs downgrade-threshold",
917 NO_STR CS_STR CS_DOWNGRADE_STR,
918 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +0200919{
Pau Espin Pedrolad79b852021-01-14 13:20:55 +0100920 the_pcu->vty.cs_downgrade_threshold = 0;
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +0200921 return CMD_SUCCESS;
922}
923
Philipp Maier9459ebd2020-09-29 23:31:33 +0200924DEFUN_ATTR(cfg_pcu_cs_lqual_ranges,
925 cfg_pcu_cs_lqual_ranges_cmd,
926 "cs link-quality-ranges cs1 <0-35> cs2 <0-35> <0-35> cs3 <0-35> <0-35> cs4 <0-35>",
927 CS_STR "Set link quality ranges for each uplink CS\n"
928 "Set quality range for CS-1 (high value only)\n"
929 "CS-1 high (dB)\n"
930 "Set quality range for CS-2\n"
931 "CS-2 low (dB)\n"
932 "CS-2 high (dB)\n"
933 "Set quality range for CS-3\n"
934 "CS-3 low (dB)\n"
935 "CS-3 high (dB)\n"
936 "Set quality range for CS-4 (low value only)\n"
937 "CS-4 low (dB)\n",
938 CMD_ATTR_IMMEDIATE)
Jacob Erlbeck94cde132015-06-09 09:44:36 +0200939{
Jacob Erlbeck94cde132015-06-09 09:44:36 +0200940 uint8_t cs1_high = atoi(argv[0]);
941 uint8_t cs2_low = atoi(argv[1]);
942 uint8_t cs2_high = atoi(argv[2]);
943 uint8_t cs3_low = atoi(argv[3]);
944 uint8_t cs3_high = atoi(argv[4]);
945 uint8_t cs4_low = atoi(argv[5]);
946
Pau Espin Pedrol54b159a2021-01-14 13:30:04 +0100947 the_pcu->vty.cs_lqual_ranges[0].high = cs1_high;
948 the_pcu->vty.cs_lqual_ranges[1].low = cs2_low;
949 the_pcu->vty.cs_lqual_ranges[1].high = cs2_high;
950 the_pcu->vty.cs_lqual_ranges[2].low = cs3_low;
951 the_pcu->vty.cs_lqual_ranges[2].high = cs3_high;
952 the_pcu->vty.cs_lqual_ranges[3].low = cs4_low;
Jacob Erlbeck94cde132015-06-09 09:44:36 +0200953
954 return CMD_SUCCESS;
955}
956
Philipp Maier9459ebd2020-09-29 23:31:33 +0200957DEFUN_ATTR(cfg_pcu_mcs_lqual_ranges,
958 cfg_pcu_mcs_lqual_ranges_cmd,
959 "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>",
960 CS_STR "Set link quality ranges for each uplink MCS\n"
961 "Set quality range for MCS-1 (high value only)\n"
962 "MCS-1 high (dB)\n"
963 "Set quality range for MCS-2\n"
964 "MCS-2 high (dB)\n"
965 "MCS-2 low (dB)\n"
966 "Set quality range for MCS-3\n"
967 "MCS-3 high (dB)\n"
968 "MCS-3 low (dB)\n"
969 "Set quality range for MCS-4\n"
970 "MCS-4 high (dB)\n"
971 "MCS-4 low (dB)\n"
972 "Set quality range for MCS-5\n"
973 "MCS-5 high (dB)\n"
974 "MCS-5 low (dB)\n"
975 "Set quality range for MCS-6\n"
976 "MCS-6 low (dB)\n"
977 "MCS-6 high (dB)\n"
978 "Set quality range for MCS-7\n"
979 "MCS-7 low (dB)\n"
980 "MCS-7 high (dB)\n"
981 "Set quality range for MCS-8\n"
982 "MCS-8 low (dB)\n"
983 "MCS-8 high (dB)\n"
984 "Set quality range for MCS-9 (low value only)\n"
985 "MCS-9 low (dB)\n",
986 CMD_ATTR_IMMEDIATE)
Minh-Quang Nguyen1f189092017-08-16 09:50:06 -0400987{
Pau Espin Pedrol54b159a2021-01-14 13:30:04 +0100988 the_pcu->vty.mcs_lqual_ranges[0].high = atoi(argv[0]);
989 the_pcu->vty.mcs_lqual_ranges[1].low = atoi(argv[1]);
990 the_pcu->vty.mcs_lqual_ranges[1].high = atoi(argv[2]);
991 the_pcu->vty.mcs_lqual_ranges[2].low = atoi(argv[3]);
992 the_pcu->vty.mcs_lqual_ranges[2].high = atoi(argv[4]);
993 the_pcu->vty.mcs_lqual_ranges[3].low = atoi(argv[5]);
994 the_pcu->vty.mcs_lqual_ranges[3].high = atoi(argv[6]);
995 the_pcu->vty.mcs_lqual_ranges[4].low = atoi(argv[7]);
996 the_pcu->vty.mcs_lqual_ranges[4].high = atoi(argv[8]);
997 the_pcu->vty.mcs_lqual_ranges[5].low = atoi(argv[9]);
998 the_pcu->vty.mcs_lqual_ranges[5].high = atoi(argv[10]);
999 the_pcu->vty.mcs_lqual_ranges[6].low = atoi(argv[11]);
1000 the_pcu->vty.mcs_lqual_ranges[6].high = atoi(argv[12]);
1001 the_pcu->vty.mcs_lqual_ranges[7].low = atoi(argv[13]);
1002 the_pcu->vty.mcs_lqual_ranges[7].high = atoi(argv[14]);
1003 the_pcu->vty.mcs_lqual_ranges[8].low = atoi(argv[15]);
Minh-Quang Nguyen1f189092017-08-16 09:50:06 -04001004
1005 return CMD_SUCCESS;
1006}
1007
Pau Espin Pedrolc4178e52017-08-08 15:03:50 +02001008DEFUN(cfg_pcu_sock,
1009 cfg_pcu_sock_cmd,
1010 "pcu-socket PATH",
1011 "Configure the osmo-bts PCU socket file/path name\n"
1012 "Path of the socket to connect to\n")
1013{
Vadim Yanitskiyfc75cc02019-11-30 20:13:25 +07001014 if (vty->type != VTY_FILE)
1015 vty_out(vty, "Changing PCU socket path at run-time has no effect%s", VTY_NEWLINE);
1016
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +01001017 osmo_talloc_replace_string(tall_pcu_ctx, &the_pcu->pcu_sock_path, argv[0]);
Pau Espin Pedrolc4178e52017-08-08 15:03:50 +02001018
1019 return CMD_SUCCESS;
1020}
Jacob Erlbeck94cde132015-06-09 09:44:36 +02001021
Philipp Maier9459ebd2020-09-29 23:31:33 +02001022DEFUN_USRATTR(cfg_pcu_gb_dialect,
1023 cfg_pcu_gb_dialect_cmd,
1024 X(PCU_VTY_ATTR_NS_RESET),
1025 "gb-dialect (classic|ip-sns)",
1026 "Select which Gb interface dialect to use\n"
1027 "Classic Gb interface with NS-{RESET,BLOCK,UNBLOCK} and static configuration\n"
1028 "Modern Gb interface with IP-SNS (Sub Network Service) and dynamic configuration\n")
Harald Welte57d35152018-07-05 03:11:17 +02001029{
Alexander Couzens290d9032020-09-16 21:52:02 +02001030 if (!strcmp(argv[0], "ip-sns")) {
Alexander Couzensf7ec5252021-01-25 20:28:38 +01001031 the_pcu->vty.ns_dialect = GPRS_NS2_DIALECT_SNS;
Alexander Couzens290d9032020-09-16 21:52:02 +02001032 } else {
Alexander Couzensf7ec5252021-01-25 20:28:38 +01001033 the_pcu->vty.ns_dialect = GPRS_NS2_DIALECT_IPACCESS;
Alexander Couzens290d9032020-09-16 21:52:02 +02001034 }
Harald Welte57d35152018-07-05 03:11:17 +02001035
1036 return CMD_SUCCESS;
1037}
1038
Harald Welted9367e32021-04-29 22:02:47 +02001039DEFUN_USRATTR(cfg_pcu_gb_ip_dscp,
1040 cfg_pcu_gb_ip_dscp_cmd,
1041 X(PCU_VTY_ATTR_NS_RESET),
1042 "gb ip-dscp <0-63>",
1043 "Configure Gb interface\n"
1044 "Set IP DSCP value for outbound packets\n"
1045 "IP DSCP value to use\n")
1046{
1047 the_pcu->vty.ns_ip_dscp = atoi(argv[0]);
1048 return CMD_SUCCESS;
1049}
1050
1051DEFUN_USRATTR(cfg_pcu_gb_priority,
1052 cfg_pcu_gb_priority_cmd,
1053 X(PCU_VTY_ATTR_NS_RESET),
1054 "gb socket-priority <0-255>",
1055 "Configure Gb interface\n"
1056 "Set socket priority value for outbound packets\n"
1057 "Socket priority value to use (>6 requires CAP_NET_ADMIN)")
1058{
1059 the_pcu->vty.ns_priority = atoi(argv[0]);
1060 return CMD_SUCCESS;
1061}
1062
Pau Espin Pedrolc0a250d2021-01-21 18:46:13 +01001063DEFUN(cfg_neighbor_resolution, cfg_neighbor_resolution_cmd,
1064 "neighbor resolution " VTY_IPV46_CMD " [<0-65535>]",
1065 "Manage local and remote-BSS neighbor cells\n"
1066 "Connect to Neighbor Resolution Service (CTRL interface) to given ip and port\n"
1067 "IPv4 address to connect to\n" "IPv6 address to connect to\n"
1068 "Port to connect to (default 4248)\n")
1069{
1070 osmo_talloc_replace_string(the_pcu, &the_pcu->vty.neigh_ctrl_addr, argv[0]);
1071 if (argc > 1)
1072 the_pcu->vty.neigh_ctrl_port = atoi(argv[1]);
1073 else
1074 the_pcu->vty.neigh_ctrl_port = OSMO_CTRL_PORT_BSC_NEIGH;
1075 return CMD_SUCCESS;
1076}
1077
1078
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +02001079DEFUN(show_bts_timer, show_bts_timer_cmd,
1080 "show bts-timer " OSMO_TDEF_VTY_ARG_T_OPTIONAL,
1081 SHOW_STR "Show BTS controlled timers\n"
1082 OSMO_TDEF_VTY_DOC_T)
1083{
Pau Espin Pedrold1049dc2021-01-18 17:14:14 +01001084 struct gprs_rlcmac_bts *bts;
1085 llist_for_each_entry(bts, &the_pcu->bts_list, list) {
1086 const char *T_arg = argc > 0 ? argv[0] : NULL;
1087 vty_out(vty, "BTS%" PRIu8 ":%s", bts->nr, VTY_NEWLINE);
1088 osmo_tdef_vty_show_cmd(vty, bts->T_defs_bts, T_arg, " ");
1089 }
1090 return CMD_SUCCESS;
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +02001091}
1092
1093DEFUN(show_timer, show_timer_cmd,
1094 "show timer " OSMO_TDEF_VTY_ARG_T_OPTIONAL,
1095 SHOW_STR "Show PCU timers\n"
1096 OSMO_TDEF_VTY_DOC_T)
1097{
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +02001098 const char *T_arg = argc > 0 ? argv[0] : NULL;
Pau Espin Pedrol924aaad2021-01-14 12:01:42 +01001099 return osmo_tdef_vty_show_cmd(vty, the_pcu->T_defs, T_arg, NULL);
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +02001100}
1101
Philipp Maier9459ebd2020-09-29 23:31:33 +02001102DEFUN_ATTR(cfg_pcu_timer, cfg_pcu_timer_cmd,
1103 "timer " OSMO_TDEF_VTY_ARG_SET_OPTIONAL,
1104 "Configure or show PCU timers\n"
1105 OSMO_TDEF_VTY_DOC_SET,
1106 CMD_ATTR_IMMEDIATE)
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +02001107{
Pau Espin Pedrolab7159f2021-01-26 17:51:44 +01001108 int rc;
1109 struct osmo_tdef *t;
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +02001110 /* If any arguments are missing, redirect to 'show' */
1111 if (argc < 2)
1112 return show_timer(self, vty, argc, argv);
Pau Espin Pedrolab7159f2021-01-26 17:51:44 +01001113 if ((rc = osmo_tdef_vty_set_cmd(vty, the_pcu->T_defs, argv)) != CMD_SUCCESS)
1114 return rc;
1115 t = osmo_tdef_vty_parse_T_arg(vty, the_pcu->T_defs, argv[0]);
1116 switch (t->T) {
1117 case PCU_TDEF_NEIGH_CACHE_ALIVE:
1118 neigh_cache_set_keep_time_interval(the_pcu->neigh_cache, t->val);
1119 break;
1120 case PCU_TDEF_SI_CACHE_ALIVE:
1121 si_cache_set_keep_time_interval(the_pcu->si_cache, t->val);
1122 break;
1123 default:
1124 break;
1125 }
1126 return CMD_SUCCESS;
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +02001127}
1128
Daniel Willmann772415f2014-01-15 17:06:51 +01001129DEFUN(show_tbf,
1130 show_tbf_cmd,
Max12a09872018-02-01 16:07:33 +01001131 "show tbf (all|ccch|pacch)",
1132 SHOW_STR "information about TBFs\n"
1133 "All TBFs\n"
1134 "TBFs allocated via CCCH\n"
1135 "TBFs allocated via PACCH\n")
Daniel Willmann772415f2014-01-15 17:06:51 +01001136{
Pau Espin Pedrold1049dc2021-01-18 17:14:14 +01001137 struct gprs_rlcmac_bts *bts;
1138 llist_for_each_entry(bts, &the_pcu->bts_list, list) {
1139 uint32_t flags = UINT32_MAX;
Max12a09872018-02-01 16:07:33 +01001140
Pau Espin Pedrold1049dc2021-01-18 17:14:14 +01001141 if (argv[0][0] == 'c')
1142 flags = (1 << GPRS_RLCMAC_FLAG_CCCH);
1143 else if (argv[0][0] == 'p')
1144 flags = (1 << GPRS_RLCMAC_FLAG_PACCH);
Max12a09872018-02-01 16:07:33 +01001145
Pau Espin Pedrold1049dc2021-01-18 17:14:14 +01001146 pcu_vty_show_tbf_all(vty, bts, flags);
1147 }
1148 return CMD_SUCCESS;
Daniel Willmann772415f2014-01-15 17:06:51 +01001149}
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +01001150
Jacob Erlbeckf47f68a2015-06-04 10:23:24 +02001151DEFUN(show_ms_all,
1152 show_ms_all_cmd,
1153 "show ms all",
1154 SHOW_STR "information about MSs\n" "All TBFs\n")
1155{
Pau Espin Pedrold1049dc2021-01-18 17:14:14 +01001156 struct gprs_rlcmac_bts *bts;
1157 llist_for_each_entry(bts, &the_pcu->bts_list, list) {
1158 pcu_vty_show_ms_all(vty, bts);
1159 }
1160 return CMD_SUCCESS;
Jacob Erlbeckf47f68a2015-06-04 10:23:24 +02001161}
1162
Jacob Erlbeck37e896d2015-06-05 16:33:33 +02001163DEFUN(show_ms_tlli,
1164 show_ms_tlli_cmd,
1165 "show ms tlli TLLI",
1166 SHOW_STR "information about MSs\n" "Select MS by TLLI\n" "TLLI as hex\n")
1167{
Pau Espin Pedrold1049dc2021-01-18 17:14:14 +01001168 struct gprs_rlcmac_bts *bts;
1169 llist_for_each_entry(bts, &the_pcu->bts_list, list) {
1170 char *endp = NULL;
1171 unsigned long long tlli = strtoll(argv[0], &endp, 16);
1172 if ((endp != NULL && *endp != 0) || tlli > 0xffffffffULL) {
1173 vty_out(vty, "Invalid TLLI.%s", VTY_NEWLINE);
1174 return CMD_WARNING;
1175 }
1176 pcu_vty_show_ms_by_tlli(vty, bts, (uint32_t)tlli);
Jacob Erlbeck37e896d2015-06-05 16:33:33 +02001177 }
Pau Espin Pedrold1049dc2021-01-18 17:14:14 +01001178 return CMD_SUCCESS;
Jacob Erlbeck37e896d2015-06-05 16:33:33 +02001179}
1180
1181DEFUN(show_ms_imsi,
1182 show_ms_imsi_cmd,
1183 "show ms imsi IMSI",
1184 SHOW_STR "information about MSs\n" "Select MS by IMSI\n" "IMSI\n")
1185{
Pau Espin Pedrold1049dc2021-01-18 17:14:14 +01001186 struct gprs_rlcmac_bts *bts;
1187 llist_for_each_entry(bts, &the_pcu->bts_list, list) {
1188 pcu_vty_show_ms_by_imsi(vty, bts, argv[0]);
1189 }
1190 return CMD_SUCCESS;
Jacob Erlbeck37e896d2015-06-05 16:33:33 +02001191}
1192
Andreas Eversberg12942562012-07-12 14:31:57 +02001193static const char pcu_copyright[] =
Harald Welted1e340f2013-01-17 12:24:29 +01001194 "Copyright (C) 2012 by Ivan Kluchnikov <kluchnikovi@gmail.com> and \r\n"
1195 " Andreas Eversberg <jolly@eversberg.eu>\r\n"
Andreas Eversberg12942562012-07-12 14:31:57 +02001196 "License GNU GPL version 2 or later\r\n"
1197 "This is free software: you are free to change and redistribute it.\r\n"
1198 "There is NO WARRANTY, to the extent permitted by law.\r\n";
1199
1200struct vty_app_info pcu_vty_info = {
Pau Espin Pedrold0fc9e82019-11-29 13:37:45 +01001201 .name = "OsmoPCU",
Andreas Eversberg12942562012-07-12 14:31:57 +02001202 .version = PACKAGE_VERSION,
1203 .copyright = pcu_copyright,
Philipp Maier9459ebd2020-09-29 23:31:33 +02001204 .usr_attr_desc = {
1205 [PCU_VTY_ATTR_NEW_TBF] = \
1206 "This command applies when a new TBF is begins",
1207 [PCU_VTY_ATTR_NEW_SUBSCR] = \
1208 "This command applies when a new subscriber attaches",
1209 [PCU_VTY_ATTR_NS_RESET] = \
1210 "This command applies when the NS is reset",
1211 },
1212 .usr_attr_letters = {
1213 [PCU_VTY_ATTR_NEW_TBF] = 'n',
1214 [PCU_VTY_ATTR_NEW_SUBSCR] = 's',
1215 [PCU_VTY_ATTR_NS_RESET] = 'r',
1216 },
Andreas Eversberg12942562012-07-12 14:31:57 +02001217};
1218
Pau Espin Pedrolcd2ac562019-08-05 14:30:44 +02001219int pcu_vty_init(void)
Andreas Eversberg12942562012-07-12 14:31:57 +02001220{
1221// install_element_ve(&show_pcu_cmd);
1222
Harald Welte717cdf52017-07-21 21:56:23 +02001223 cfg_pcu_gsmtap_categ_cmd.string = vty_cmd_string_from_valstr(tall_pcu_ctx, pcu_gsmtap_categ_names,
1224 "gsmtap-category (",
1225 "|",")", VTY_DO_LOWER);
1226 cfg_pcu_gsmtap_categ_cmd.doc = vty_cmd_string_from_valstr(tall_pcu_ctx, pcu_gsmtap_categ_help,
1227 "GSMTAP Category\n",
1228 "\n", "", 0);
1229 cfg_pcu_no_gsmtap_categ_cmd.string = vty_cmd_string_from_valstr(tall_pcu_ctx, pcu_gsmtap_categ_names,
1230 "no gsmtap-category (",
1231 "|",")", VTY_DO_LOWER);
1232 cfg_pcu_no_gsmtap_categ_cmd.doc = vty_cmd_string_from_valstr(tall_pcu_ctx, pcu_gsmtap_categ_help,
1233 NO_STR "GSMTAP Category\n",
1234 "\n", "", 0);
1235
Pau Espin Pedrolcd2ac562019-08-05 14:30:44 +02001236 logging_vty_add_cmds();
1237 osmo_stats_vty_add_cmds();
Vadim Yanitskiyd83c8ff2020-02-06 16:46:17 +07001238 osmo_talloc_vty_add_cmds();
Vadim Yanitskiy830ca262021-02-05 23:22:37 +01001239 osmo_fsm_vty_add_cmds();
Andreas Eversberg12942562012-07-12 14:31:57 +02001240
Andreas Eversberg8b761a32012-07-20 21:50:31 +02001241 install_node(&pcu_node, config_write_pcu);
1242 install_element(CONFIG_NODE, &cfg_pcu_cmd);
Jacob Erlbeck953c7892015-09-28 18:12:57 +02001243 install_element(PCU_NODE, &cfg_pcu_egprs_cmd);
1244 install_element(PCU_NODE, &cfg_pcu_no_egprs_cmd);
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +02001245 install_element(PCU_NODE, &cfg_pcu_no_two_phase_cmd);
Andreas Eversberg8b761a32012-07-20 21:50:31 +02001246 install_element(PCU_NODE, &cfg_pcu_cs_cmd);
1247 install_element(PCU_NODE, &cfg_pcu_no_cs_cmd);
Jacob Erlbeckb33e6752015-06-04 19:04:30 +02001248 install_element(PCU_NODE, &cfg_pcu_cs_max_cmd);
1249 install_element(PCU_NODE, &cfg_pcu_no_cs_max_cmd);
Jacob Erlbeck8322d082015-06-04 15:12:10 +02001250 install_element(PCU_NODE, &cfg_pcu_cs_err_limits_cmd);
1251 install_element(PCU_NODE, &cfg_pcu_no_cs_err_limits_cmd);
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +02001252 install_element(PCU_NODE, &cfg_pcu_cs_downgrade_thrsh_cmd);
1253 install_element(PCU_NODE, &cfg_pcu_no_cs_downgrade_thrsh_cmd);
Jacob Erlbeck94cde132015-06-09 09:44:36 +02001254 install_element(PCU_NODE, &cfg_pcu_cs_lqual_ranges_cmd);
Minh-Quang Nguyen1f189092017-08-16 09:50:06 -04001255 install_element(PCU_NODE, &cfg_pcu_mcs_lqual_ranges_cmd);
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +01001256 install_element(PCU_NODE, &cfg_pcu_mcs_cmd);
Aravind Sirsikar50b09702016-08-22 17:21:10 +05301257 install_element(PCU_NODE, &cfg_pcu_dl_arq_cmd);
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +01001258 install_element(PCU_NODE, &cfg_pcu_no_mcs_cmd);
Jacob Erlbeck0d058052016-01-07 11:48:28 +01001259 install_element(PCU_NODE, &cfg_pcu_mcs_max_cmd);
1260 install_element(PCU_NODE, &cfg_pcu_no_mcs_max_cmd);
Jacob Erlbeck36df7742016-01-19 15:53:30 +01001261 install_element(PCU_NODE, &cfg_pcu_window_size_cmd);
Andreas Eversberg24131bf2012-07-21 11:09:58 +02001262 install_element(PCU_NODE, &cfg_pcu_queue_lifetime_cmd);
1263 install_element(PCU_NODE, &cfg_pcu_queue_lifetime_inf_cmd);
1264 install_element(PCU_NODE, &cfg_pcu_no_queue_lifetime_cmd);
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +01001265 install_element(PCU_NODE, &cfg_pcu_queue_hysteresis_cmd);
1266 install_element(PCU_NODE, &cfg_pcu_no_queue_hysteresis_cmd);
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +02001267 install_element(PCU_NODE, &cfg_pcu_queue_codel_cmd);
1268 install_element(PCU_NODE, &cfg_pcu_queue_codel_interval_cmd);
1269 install_element(PCU_NODE, &cfg_pcu_no_queue_codel_cmd);
Jacob Erlbeckd0261b72015-04-02 13:58:09 +02001270 install_element(PCU_NODE, &cfg_pcu_queue_idle_ack_delay_cmd);
1271 install_element(PCU_NODE, &cfg_pcu_no_queue_idle_ack_delay_cmd);
Andreas Eversberga1503fa2012-07-22 08:58:09 +02001272 install_element(PCU_NODE, &cfg_pcu_alloc_cmd);
Andreas Eversberg07e97cf2012-08-07 16:00:56 +02001273 install_element(PCU_NODE, &cfg_pcu_two_phase_cmd);
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +02001274 install_element(PCU_NODE, &cfg_pcu_fc_interval_cmd);
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +02001275 install_element(PCU_NODE, &cfg_pcu_fc_bucket_time_cmd);
1276 install_element(PCU_NODE, &cfg_pcu_no_fc_bucket_time_cmd);
Jacob Erlbeck87d73412015-04-21 12:56:48 +02001277 install_element(PCU_NODE, &cfg_pcu_fc_bvc_bucket_size_cmd);
1278 install_element(PCU_NODE, &cfg_pcu_no_fc_bvc_bucket_size_cmd);
1279 install_element(PCU_NODE, &cfg_pcu_fc_bvc_leak_rate_cmd);
1280 install_element(PCU_NODE, &cfg_pcu_no_fc_bvc_leak_rate_cmd);
1281 install_element(PCU_NODE, &cfg_pcu_fc_ms_bucket_size_cmd);
1282 install_element(PCU_NODE, &cfg_pcu_no_fc_ms_bucket_size_cmd);
1283 install_element(PCU_NODE, &cfg_pcu_fc_ms_leak_rate_cmd);
1284 install_element(PCU_NODE, &cfg_pcu_no_fc_ms_leak_rate_cmd);
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +02001285 install_element(PCU_NODE, &cfg_pcu_alpha_cmd);
1286 install_element(PCU_NODE, &cfg_pcu_gamma_cmd);
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +01001287 install_element(PCU_NODE, &cfg_pcu_dl_tbf_idle_time_cmd);
1288 install_element(PCU_NODE, &cfg_pcu_no_dl_tbf_idle_time_cmd);
Oliver Smith45fdc442019-09-05 15:12:20 +02001289 install_element(PCU_NODE, &cfg_pcu_dl_tbf_preemptive_retransmission_cmd);
1290 install_element(PCU_NODE, &cfg_pcu_no_dl_tbf_preemptive_retransmission_cmd);
Jacob Erlbecka098c192015-05-28 16:11:19 +02001291 install_element(PCU_NODE, &cfg_pcu_ms_idle_time_cmd);
1292 install_element(PCU_NODE, &cfg_pcu_no_ms_idle_time_cmd);
Harald Welte717cdf52017-07-21 21:56:23 +02001293 install_element(PCU_NODE, &cfg_pcu_gsmtap_categ_cmd);
1294 install_element(PCU_NODE, &cfg_pcu_no_gsmtap_categ_cmd);
Pau Espin Pedrolc4178e52017-08-08 15:03:50 +02001295 install_element(PCU_NODE, &cfg_pcu_sock_cmd);
Harald Welte57d35152018-07-05 03:11:17 +02001296 install_element(PCU_NODE, &cfg_pcu_gb_dialect_cmd);
Harald Welted9367e32021-04-29 22:02:47 +02001297 install_element(PCU_NODE, &cfg_pcu_gb_ip_dscp_cmd);
1298 install_element(PCU_NODE, &cfg_pcu_gb_priority_cmd);
Pau Espin Pedrolc0a250d2021-01-21 18:46:13 +01001299 install_element(PCU_NODE, &cfg_neighbor_resolution_cmd);
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +02001300 install_element(PCU_NODE, &cfg_pcu_timer_cmd);
Andreas Eversberg8b761a32012-07-20 21:50:31 +02001301
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +01001302 install_element_ve(&show_bts_stats_cmd);
Pau Espin Pedrola1ac2f02020-09-22 17:01:31 +02001303 install_element_ve(&show_bts_pdch_cmd);
Daniel Willmann772415f2014-01-15 17:06:51 +01001304 install_element_ve(&show_tbf_cmd);
Jacob Erlbeckf47f68a2015-06-04 10:23:24 +02001305 install_element_ve(&show_ms_all_cmd);
Jacob Erlbeck37e896d2015-06-05 16:33:33 +02001306 install_element_ve(&show_ms_tlli_cmd);
1307 install_element_ve(&show_ms_imsi_cmd);
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +02001308 install_element_ve(&show_bts_timer_cmd);
1309 install_element_ve(&show_timer_cmd);
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +01001310
Andreas Eversberg12942562012-07-12 14:31:57 +02001311 return 0;
1312}