blob: 64f4589205180fcdd7ac28a19bc19e5c5c9244c9 [file] [log] [blame]
Holger Hans Peter Freytherf8c42192013-01-09 17:03:27 +01001/*
Holger Hans Peter Freyther4e13a8f2015-01-31 22:16:00 +01002 * (C) 2013-2015 by Holger Hans Peter Freyther
3 * (C) 2013-2015 by sysmocom s.f.m.c. GmbH
Holger Hans Peter Freytherf8c42192013-01-09 17:03:27 +01004 *
5 * All Rights Reserved
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU Affero General Public License as published by
9 * the Free Software Foundation; either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU Affero General Public License for more details.
16 *
17 * You should have received a copy of the GNU Affero General Public License
18 * along with this program. If not, see <http://www.gnu.org/licenses/>.
19 *
20 */
Harald Welteba874b82014-08-20 23:47:15 +020021#include <errno.h>
Holger Hans Peter Freyther349c40f2015-02-10 21:37:16 +010022#include <time.h>
Holger Hans Peter Freytherf8c42192013-01-09 17:03:27 +010023
Harald Welteba874b82014-08-20 23:47:15 +020024#include <osmocom/ctrl/control_cmd.h>
Neels Hofmeyrf93970b2018-03-05 02:09:40 +010025#include <osmocom/gsm/gsm48.h>
Neels Hofmeyrc0164792017-09-04 15:15:32 +020026#include <osmocom/bsc/ipaccess.h>
27#include <osmocom/bsc/gsm_data.h>
28#include <osmocom/bsc/abis_nm.h>
29#include <osmocom/bsc/debug.h>
30#include <osmocom/bsc/chan_alloc.h>
31#include <osmocom/bsc/osmo_bsc_rf.h>
32#include <osmocom/bsc/bsc_msc_data.h>
Holger Hans Peter Freytherf8c42192013-01-09 17:03:27 +010033
Neels Hofmeyrf93970b2018-03-05 02:09:40 +010034CTRL_CMD_DEFINE(net_mcc, "mcc");
35static int get_net_mcc(struct ctrl_cmd *cmd, void *_data)
36{
37 struct gsm_network *net = cmd->node;
38 cmd->reply = talloc_asprintf(cmd, "%s", osmo_mcc_name(net->plmn.mcc));
39 if (!cmd->reply) {
40 cmd->reply = "OOM";
41 return CTRL_CMD_ERROR;
42 }
43 return CTRL_CMD_REPLY;
44}
45static int set_net_mcc(struct ctrl_cmd *cmd, void *_data)
46{
47 struct gsm_network *net = cmd->node;
48 uint16_t mcc;
49 if (osmo_mcc_from_str(cmd->value, &mcc))
50 return -1;
51 net->plmn.mcc = mcc;
52 return get_net_mcc(cmd, _data);
53}
54static int verify_net_mcc(struct ctrl_cmd *cmd, const char *value, void *_data)
55{
56 if (osmo_mcc_from_str(value, NULL))
57 return -1;
58 return 0;
59}
60
61CTRL_CMD_DEFINE(net_mnc, "mnc");
62static int get_net_mnc(struct ctrl_cmd *cmd, void *_data)
63{
64 struct gsm_network *net = cmd->node;
65 cmd->reply = talloc_asprintf(cmd, "%s", osmo_mnc_name(net->plmn.mnc, net->plmn.mnc_3_digits));
66 if (!cmd->reply) {
67 cmd->reply = "OOM";
68 return CTRL_CMD_ERROR;
69 }
70 return CTRL_CMD_REPLY;
71}
72static int set_net_mnc(struct ctrl_cmd *cmd, void *_data)
73{
74 struct gsm_network *net = cmd->node;
75 struct osmo_plmn_id plmn = net->plmn;
76 if (osmo_mnc_from_str(cmd->value, &plmn.mnc, &plmn.mnc_3_digits)) {
77 cmd->reply = "Error while decoding MNC";
78 return CTRL_CMD_ERROR;
79 }
80 net->plmn = plmn;
81 return get_net_mnc(cmd, _data);
82}
83static int verify_net_mnc(struct ctrl_cmd *cmd, const char *value, void *_data)
84{
85 if (osmo_mnc_from_str(value, NULL, NULL))
86 return -1;
87 return 0;
88}
Holger Hans Peter Freytherf8c42192013-01-09 17:03:27 +010089
Holger Hans Peter Freyther6ca9f4f2013-01-09 17:30:11 +010090static int set_net_apply_config(struct ctrl_cmd *cmd, void *data)
91{
92 struct gsm_network *net = cmd->node;
93 struct gsm_bts *bts;
94
95 llist_for_each_entry(bts, &net->bts_list, list) {
96 if (!is_ipaccess_bts(bts))
97 continue;
98
Holger Hans Peter Freytherc6a65512016-03-16 15:27:38 +010099 /*
100 * The ip.access nanoBTS seems to be unrelaible on BSSGP
101 * so let's us just reboot it. For the sysmoBTS we can just
102 * restart the process as all state is gone.
103 */
104 if (!is_sysmobts_v2(bts) && strcmp(cmd->value, "restart") == 0) {
105 struct gsm_bts_trx *trx;
106 llist_for_each_entry_reverse(trx, &bts->trx_list, list)
107 abis_nm_ipaccess_restart(trx);
108 } else
109 ipaccess_drop_oml(bts);
Holger Hans Peter Freyther6ca9f4f2013-01-09 17:30:11 +0100110 }
111
112 cmd->reply = "Tried to drop the BTS";
113 return CTRL_CMD_REPLY;
114}
115
Maxf6e51702017-01-11 18:37:55 +0100116CTRL_CMD_DEFINE_WO_NOVRF(net_apply_config, "apply-configuration");
Holger Hans Peter Freyther6ca9f4f2013-01-09 17:30:11 +0100117
Holger Hans Peter Freyther3adb7722014-03-04 17:16:58 +0100118static int verify_net_mcc_mnc_apply(struct ctrl_cmd *cmd, const char *value, void *d)
119{
120 char *tmp, *saveptr, *mcc, *mnc;
Neels Hofmeyrf93970b2018-03-05 02:09:40 +0100121 int rc = 0;
Holger Hans Peter Freyther3adb7722014-03-04 17:16:58 +0100122
123 tmp = talloc_strdup(cmd, value);
124 if (!tmp)
125 return 1;
126
127 mcc = strtok_r(tmp, ",", &saveptr);
128 mnc = strtok_r(NULL, ",", &saveptr);
Holger Hans Peter Freyther3adb7722014-03-04 17:16:58 +0100129
Neels Hofmeyrf93970b2018-03-05 02:09:40 +0100130 if (osmo_mcc_from_str(mcc, NULL) || osmo_mnc_from_str(mnc, NULL, NULL))
131 rc = -1;
132
133 talloc_free(tmp);
134 return rc;
Holger Hans Peter Freyther3adb7722014-03-04 17:16:58 +0100135}
136
Holger Hans Peter Freyther3adb7722014-03-04 17:16:58 +0100137static int set_net_mcc_mnc_apply(struct ctrl_cmd *cmd, void *data)
138{
139 struct gsm_network *net = cmd->node;
140 char *tmp, *saveptr, *mcc_str, *mnc_str;
Neels Hofmeyrf93970b2018-03-05 02:09:40 +0100141 struct osmo_plmn_id plmn;
Holger Hans Peter Freyther3adb7722014-03-04 17:16:58 +0100142
143 tmp = talloc_strdup(cmd, cmd->value);
144 if (!tmp)
145 goto oom;
146
Holger Hans Peter Freyther3adb7722014-03-04 17:16:58 +0100147 mcc_str = strtok_r(tmp, ",", &saveptr);
148 mnc_str = strtok_r(NULL, ",", &saveptr);
149
Neels Hofmeyrf93970b2018-03-05 02:09:40 +0100150 if (osmo_mcc_from_str(mcc_str, &plmn.mcc)) {
151 cmd->reply = "Error while decoding MCC";
152 return CTRL_CMD_ERROR;
153 }
154
155 if (osmo_mnc_from_str(mnc_str, &plmn.mnc, &plmn.mnc_3_digits)) {
156 cmd->reply = "Error while decoding MNC";
157 return CTRL_CMD_ERROR;
158 }
Holger Hans Peter Freyther3adb7722014-03-04 17:16:58 +0100159
160 talloc_free(tmp);
161
Neels Hofmeyrf93970b2018-03-05 02:09:40 +0100162 if (!osmo_plmn_cmp(&net->plmn, &plmn)) {
Holger Hans Peter Freyther3adb7722014-03-04 17:16:58 +0100163 cmd->reply = "Nothing changed";
164 return CTRL_CMD_REPLY;
165 }
166
Neels Hofmeyrf93970b2018-03-05 02:09:40 +0100167 net->plmn = plmn;
Holger Hans Peter Freyther3adb7722014-03-04 17:16:58 +0100168
169 return set_net_apply_config(cmd, data);
170
171oom:
172 cmd->reply = "OOM";
173 return CTRL_CMD_ERROR;
174}
Maxf6e51702017-01-11 18:37:55 +0100175CTRL_CMD_DEFINE_WO(net_mcc_mnc_apply, "mcc-mnc-apply");
Holger Hans Peter Freyther3adb7722014-03-04 17:16:58 +0100176
Holger Hans Peter Freyther054bc242014-11-10 11:41:03 +0100177/* BTS related commands below */
178CTRL_CMD_DEFINE_RANGE(bts_lac, "location-area-code", struct gsm_bts, location_area_code, 0, 65535);
Holger Hans Peter Freyther8a641412014-11-21 10:54:42 +0100179CTRL_CMD_DEFINE_RANGE(bts_ci, "cell-identity", struct gsm_bts, cell_identity, 0, 65535);
Holger Hans Peter Freyther054bc242014-11-10 11:41:03 +0100180
Holger Hans Peter Freytherb1461152014-11-21 10:20:29 +0100181static int set_bts_apply_config(struct ctrl_cmd *cmd, void *data)
182{
183 struct gsm_bts *bts = cmd->node;
184
185 if (!is_ipaccess_bts(bts)) {
186 cmd->reply = "BTS is not IP based";
187 return CTRL_CMD_ERROR;
188 }
189
190 ipaccess_drop_oml(bts);
191 cmd->reply = "Tried to drop the BTS";
192 return CTRL_CMD_REPLY;
193}
194
Maxf6e51702017-01-11 18:37:55 +0100195CTRL_CMD_DEFINE_WO_NOVRF(bts_apply_config, "apply-configuration");
Holger Hans Peter Freythera49b2c02014-11-21 11:18:45 +0100196
197static int set_bts_si(struct ctrl_cmd *cmd, void *data)
198{
199 struct gsm_bts *bts = cmd->node;
Alexander Chemerisc36a13b2015-05-30 14:40:54 -0400200 int rc;
Holger Hans Peter Freythera49b2c02014-11-21 11:18:45 +0100201
Alexander Chemerisc36a13b2015-05-30 14:40:54 -0400202 rc = gsm_bts_set_system_infos(bts);
203 if (rc != 0) {
204 cmd->reply = "Failed to generate SI";
205 return CTRL_CMD_ERROR;
Holger Hans Peter Freythera49b2c02014-11-21 11:18:45 +0100206 }
207
208 cmd->reply = "Generated new System Information";
209 return CTRL_CMD_REPLY;
210}
Maxf6e51702017-01-11 18:37:55 +0100211CTRL_CMD_DEFINE_WO_NOVRF(bts_si, "send-new-system-informations");
Holger Hans Peter Freyther5eebb7a2014-12-05 12:03:24 +0100212
213static int get_bts_chan_load(struct ctrl_cmd *cmd, void *data)
214{
215 int i;
216 struct pchan_load pl;
217 struct gsm_bts *bts;
218 const char *space = "";
219
220 bts = cmd->node;
221 memset(&pl, 0, sizeof(pl));
Neels Hofmeyr2afffd52016-09-25 17:01:20 +0200222 bts_chan_load(&pl, bts);
Holger Hans Peter Freyther5eebb7a2014-12-05 12:03:24 +0100223
224 cmd->reply = talloc_strdup(cmd, "");
225
226 for (i = 0; i < ARRAY_SIZE(pl.pchan); ++i) {
227 const struct load_counter *lc = &pl.pchan[i];
228
229 /* These can never have user load */
230 if (i == GSM_PCHAN_NONE)
231 continue;
232 if (i == GSM_PCHAN_CCCH)
233 continue;
234 if (i == GSM_PCHAN_PDCH)
235 continue;
Holger Hans Peter Freytherb8c204c2015-01-31 19:42:42 +0100236 if (i == GSM_PCHAN_UNKNOWN)
237 continue;
Holger Hans Peter Freyther5eebb7a2014-12-05 12:03:24 +0100238
239 cmd->reply = talloc_asprintf_append(cmd->reply,
240 "%s%s,%u,%u",
241 space, gsm_pchan_name(i), lc->used, lc->total);
242 if (!cmd->reply)
243 goto error;
244 space = " ";
245 }
246
247 return CTRL_CMD_REPLY;
248
249error:
250 cmd->reply = "Memory allocation failure";
251 return CTRL_CMD_ERROR;
252}
253
Maxf6e51702017-01-11 18:37:55 +0100254CTRL_CMD_DEFINE_RO(bts_chan_load, "channel-load");
Holger Hans Peter Freyther1f6cce72014-12-05 14:44:21 +0100255
256static int get_bts_oml_conn(struct ctrl_cmd *cmd, void *data)
257{
Max3d049d22017-10-09 17:12:53 +0200258 const struct gsm_bts *bts = cmd->node;
Holger Hans Peter Freyther1f6cce72014-12-05 14:44:21 +0100259
Max3d049d22017-10-09 17:12:53 +0200260 cmd->reply = get_model_oml_status(bts);
261
Holger Hans Peter Freyther1f6cce72014-12-05 14:44:21 +0100262 return CTRL_CMD_REPLY;
263}
264
Maxf6e51702017-01-11 18:37:55 +0100265CTRL_CMD_DEFINE_RO(bts_oml_conn, "oml-connection-state");
Holger Hans Peter Freyther1f6cce72014-12-05 14:44:21 +0100266
Max25cc4072017-10-10 14:50:35 +0200267static int get_bts_oml_up(struct ctrl_cmd *cmd, void *data)
268{
269 const struct gsm_bts *bts = cmd->node;
270
271 cmd->reply = talloc_asprintf(cmd, "%llu", bts_uptime(bts));
272 if (!cmd->reply) {
273 cmd->reply = "OOM";
274 return CTRL_CMD_ERROR;
275 }
276
277 return CTRL_CMD_REPLY;
278}
279
280CTRL_CMD_DEFINE_RO(bts_oml_up, "oml-uptime");
281
Holger Hans Peter Freyther4e13a8f2015-01-31 22:16:00 +0100282static int verify_bts_gprs_mode(struct ctrl_cmd *cmd, const char *value, void *_data)
283{
284 int valid;
285 enum bts_gprs_mode mode;
286 struct gsm_bts *bts = cmd->node;
287
288 mode = bts_gprs_mode_parse(value, &valid);
289 if (!valid) {
290 cmd->reply = "Mode is not known";
291 return 1;
292 }
293
294 if (!bts_gprs_mode_is_compat(bts, mode)) {
295 cmd->reply = "bts does not support this mode";
296 return 1;
297 }
298
299 return 0;
300}
301
302static int get_bts_gprs_mode(struct ctrl_cmd *cmd, void *data)
303{
304 struct gsm_bts *bts = cmd->node;
305
306 cmd->reply = talloc_strdup(cmd, bts_gprs_mode_name(bts->gprs.mode));
307 return CTRL_CMD_REPLY;
308}
309
310static int set_bts_gprs_mode(struct ctrl_cmd *cmd, void *data)
311{
312 struct gsm_bts *bts = cmd->node;
313
314 bts->gprs.mode = bts_gprs_mode_parse(cmd->value, NULL);
315 return get_bts_gprs_mode(cmd, data);
316}
317
318CTRL_CMD_DEFINE(bts_gprs_mode, "gprs-mode");
319
Holger Hans Peter Freyther349c40f2015-02-10 21:37:16 +0100320static int get_bts_rf_state(struct ctrl_cmd *cmd, void *data)
321{
322 const char *oper, *admin, *policy;
323 struct gsm_bts *bts = cmd->node;
324
325 if (!bts) {
326 cmd->reply = "bts not found.";
327 return CTRL_CMD_ERROR;
328 }
329
330 oper = osmo_bsc_rf_get_opstate_name(osmo_bsc_rf_get_opstate_by_bts(bts));
331 admin = osmo_bsc_rf_get_adminstate_name(osmo_bsc_rf_get_adminstate_by_bts(bts));
332 policy = osmo_bsc_rf_get_policy_name(osmo_bsc_rf_get_policy_by_bts(bts));
333
334 cmd->reply = talloc_asprintf(cmd, "%s,%s,%s", oper, admin, policy);
335 if (!cmd->reply) {
336 cmd->reply = "OOM.";
337 return CTRL_CMD_ERROR;
338 }
339
340 return CTRL_CMD_REPLY;
341}
342CTRL_CMD_DEFINE_RO(bts_rf_state, "rf_state");
343
344static int get_net_rf_lock(struct ctrl_cmd *cmd, void *data)
345{
Holger Hans Peter Freyther66105fd2015-02-10 23:03:25 +0100346 struct gsm_network *net = cmd->node;
347 struct gsm_bts *bts;
348 const char *policy_name;
349
350 policy_name = osmo_bsc_rf_get_policy_name(net->bsc_data->rf_ctrl->policy);
351
352 llist_for_each_entry(bts, &net->bts_list, list) {
353 struct gsm_bts_trx *trx;
354
355 /* Exclude the BTS from the global lock */
356 if (bts->excl_from_rf_lock)
357 continue;
358
359 llist_for_each_entry(trx, &bts->trx_list, list) {
360 if (trx->mo.nm_state.availability == NM_AVSTATE_OK &&
361 trx->mo.nm_state.operational != NM_OPSTATE_DISABLED) {
362 cmd->reply = talloc_asprintf(cmd,
363 "state=on,policy=%s,bts=%u,trx=%u",
364 policy_name, bts->nr, trx->nr);
365 return CTRL_CMD_REPLY;
366 }
367 }
368 }
369
370 cmd->reply = talloc_asprintf(cmd, "state=off,policy=%s",
371 policy_name);
372 return CTRL_CMD_REPLY;
Holger Hans Peter Freyther349c40f2015-02-10 21:37:16 +0100373}
374
375#define TIME_FORMAT_RFC2822 "%a, %d %b %Y %T %z"
376
377static int set_net_rf_lock(struct ctrl_cmd *cmd, void *data)
378{
379 int locked = atoi(cmd->value);
380 struct gsm_network *net = cmd->node;
381 time_t now = time(NULL);
382 char now_buf[64];
383 struct osmo_bsc_rf *rf;
384
385 if (!net) {
386 cmd->reply = "net not found.";
387 return CTRL_CMD_ERROR;
388 }
389
390 rf = net->bsc_data->rf_ctrl;
391
392 if (!rf) {
393 cmd->reply = "RF Ctrl is not enabled in the BSC Configuration";
394 return CTRL_CMD_ERROR;
395 }
396
397 talloc_free(rf->last_rf_lock_ctrl_command);
398 strftime(now_buf, sizeof(now_buf), TIME_FORMAT_RFC2822, gmtime(&now));
399 rf->last_rf_lock_ctrl_command =
400 talloc_asprintf(rf, "rf_locked %u (%s)", locked, now_buf);
401
402 osmo_bsc_rf_schedule_lock(rf, locked == 1 ? '0' : '1');
403
404 cmd->reply = talloc_asprintf(cmd, "%u", locked);
405 if (!cmd->reply) {
406 cmd->reply = "OOM.";
407 return CTRL_CMD_ERROR;
408 }
409
410 return CTRL_CMD_REPLY;
411}
412
413static int verify_net_rf_lock(struct ctrl_cmd *cmd, const char *value, void *data)
414{
415 int locked = atoi(cmd->value);
416
417 if ((locked != 0) && (locked != 1))
418 return 1;
419
420 return 0;
421}
422CTRL_CMD_DEFINE(net_rf_lock, "rf_locked");
Holger Hans Peter Freyther4e13a8f2015-01-31 22:16:00 +0100423
Holger Hans Peter Freytherca415192015-02-10 21:55:37 +0100424static int get_net_bts_num(struct ctrl_cmd *cmd, void *data)
425{
426 struct gsm_network *net = cmd->node;
427
428 cmd->reply = talloc_asprintf(cmd, "%u", net->num_bts);
429 return CTRL_CMD_REPLY;
430}
431CTRL_CMD_DEFINE_RO(net_bts_num, "number-of-bts");
432
Holger Hans Peter Freytherd092f482014-03-23 11:17:27 +0100433/* TRX related commands below here */
434CTRL_HELPER_GET_INT(trx_max_power, struct gsm_bts_trx, max_power_red);
Holger Hans Peter Freytherd092f482014-03-23 11:17:27 +0100435static int verify_trx_max_power(struct ctrl_cmd *cmd, const char *value, void *_data)
436{
437 int tmp = atoi(value);
438
439 if (tmp < 0 || tmp > 22) {
440 cmd->reply = "Value must be between 0 and 22";
441 return -1;
442 }
443
444 if (tmp & 1) {
445 cmd->reply = "Value must be even";
446 return -1;
447 }
448
449 return 0;
450}
Holger Hans Peter Freyther175a2402013-01-09 19:55:04 +0100451CTRL_CMD_DEFINE_RANGE(trx_arfcn, "arfcn", struct gsm_bts_trx, arfcn, 0, 1023);
Holger Hans Peter Freyther8a158bb2014-03-26 14:24:42 +0100452
453static int set_trx_max_power(struct ctrl_cmd *cmd, void *_data)
454{
455 struct gsm_bts_trx *trx = cmd->node;
456 int old_power;
457
458 /* remember the old value, set the new one */
459 old_power = trx->max_power_red;
460 trx->max_power_red = atoi(cmd->value);
461
462 /* Maybe update the value */
463 if (old_power != trx->max_power_red) {
464 LOGP(DCTRL, LOGL_NOTICE,
465 "%s updating max_pwr_red(%d)\n",
466 gsm_trx_name(trx), trx->max_power_red);
467 abis_nm_update_max_power_red(trx);
468 }
469
470 return get_trx_max_power(cmd, _data);
471}
Holger Hans Peter Freytherd092f482014-03-23 11:17:27 +0100472CTRL_CMD_DEFINE(trx_max_power, "max-power-reduction");
473
Holger Hans Peter Freytherf8c42192013-01-09 17:03:27 +0100474int bsc_base_ctrl_cmds_install(void)
475{
476 int rc = 0;
477 rc |= ctrl_cmd_install(CTRL_NODE_ROOT, &cmd_net_mnc);
478 rc |= ctrl_cmd_install(CTRL_NODE_ROOT, &cmd_net_mcc);
Holger Hans Peter Freyther6ca9f4f2013-01-09 17:30:11 +0100479 rc |= ctrl_cmd_install(CTRL_NODE_ROOT, &cmd_net_apply_config);
Holger Hans Peter Freyther3adb7722014-03-04 17:16:58 +0100480 rc |= ctrl_cmd_install(CTRL_NODE_ROOT, &cmd_net_mcc_mnc_apply);
Holger Hans Peter Freyther349c40f2015-02-10 21:37:16 +0100481 rc |= ctrl_cmd_install(CTRL_NODE_ROOT, &cmd_net_rf_lock);
Holger Hans Peter Freytherca415192015-02-10 21:55:37 +0100482 rc |= ctrl_cmd_install(CTRL_NODE_ROOT, &cmd_net_bts_num);
Holger Hans Peter Freytherf8c42192013-01-09 17:03:27 +0100483
Holger Hans Peter Freyther054bc242014-11-10 11:41:03 +0100484 rc |= ctrl_cmd_install(CTRL_NODE_BTS, &cmd_bts_lac);
Holger Hans Peter Freyther8a641412014-11-21 10:54:42 +0100485 rc |= ctrl_cmd_install(CTRL_NODE_BTS, &cmd_bts_ci);
Holger Hans Peter Freytherb1461152014-11-21 10:20:29 +0100486 rc |= ctrl_cmd_install(CTRL_NODE_BTS, &cmd_bts_apply_config);
Holger Hans Peter Freythera49b2c02014-11-21 11:18:45 +0100487 rc |= ctrl_cmd_install(CTRL_NODE_BTS, &cmd_bts_si);
Holger Hans Peter Freyther5eebb7a2014-12-05 12:03:24 +0100488 rc |= ctrl_cmd_install(CTRL_NODE_BTS, &cmd_bts_chan_load);
Holger Hans Peter Freyther1f6cce72014-12-05 14:44:21 +0100489 rc |= ctrl_cmd_install(CTRL_NODE_BTS, &cmd_bts_oml_conn);
Max25cc4072017-10-10 14:50:35 +0200490 rc |= ctrl_cmd_install(CTRL_NODE_BTS, &cmd_bts_oml_up);
Holger Hans Peter Freyther4e13a8f2015-01-31 22:16:00 +0100491 rc |= ctrl_cmd_install(CTRL_NODE_BTS, &cmd_bts_gprs_mode);
Holger Hans Peter Freyther349c40f2015-02-10 21:37:16 +0100492 rc |= ctrl_cmd_install(CTRL_NODE_BTS, &cmd_bts_rf_state);
Holger Hans Peter Freyther054bc242014-11-10 11:41:03 +0100493
Holger Hans Peter Freytherd092f482014-03-23 11:17:27 +0100494 rc |= ctrl_cmd_install(CTRL_NODE_TRX, &cmd_trx_max_power);
Holger Hans Peter Freyther175a2402013-01-09 19:55:04 +0100495 rc |= ctrl_cmd_install(CTRL_NODE_TRX, &cmd_trx_arfcn);
496
Holger Hans Peter Freytherf8c42192013-01-09 17:03:27 +0100497 return rc;
498}