blob: 4c587dca865247a211252c9150b1ef39583b74dd [file] [log] [blame]
Holger Hans Peter Freytherf8c42192013-01-09 17:03:27 +01001/*
2 * (C) 2013 by Holger Hans Peter Freyther
3 * (C) 2013 by sysmocom s.f.m.c. GmbH
4 *
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 */
21
22#include <openbsc/control_cmd.h>
Holger Hans Peter Freyther6ca9f4f2013-01-09 17:30:11 +010023#include <openbsc/ipaccess.h>
Holger Hans Peter Freytherf8c42192013-01-09 17:03:27 +010024#include <openbsc/gsm_data.h>
Holger Hans Peter Freyther8a158bb2014-03-26 14:24:42 +010025#include <openbsc/abis_nm.h>
26#include <openbsc/debug.h>
Holger Hans Peter Freytherf8c42192013-01-09 17:03:27 +010027
28#define CTRL_CMD_VTY_STRING(cmdname, cmdstr, dtype, element) \
29 CTRL_HELPER_GET_STRING(cmdname, dtype, element) \
30 CTRL_HELPER_SET_STRING(cmdname, dtype, element) \
31static struct ctrl_cmd_element cmd_##cmdname = { \
32 .name = cmdstr, \
Holger Hans Peter Freytherf8c42192013-01-09 17:03:27 +010033 .get = get_##cmdname, \
34 .set = set_##cmdname, \
35 .verify = verify_vty_description_string, \
36}
37
38/**
39 * Check that there are no newlines or comments or other things
40 * that could make the VTY configuration unparsable.
41 */
42static int verify_vty_description_string(struct ctrl_cmd *cmd,
43 const char *value, void *data)
44{
45 int i;
46 const size_t len = strlen(value);
47
48 for (i = 0; i < len; ++i) {
49 switch(value[i]) {
50 case '#':
51 case '\n':
52 case '\r':
53 cmd->reply = "String includes illegal character";
54 return -1;
55 default:
56 break;
57 }
58 }
59
60 return 0;
61}
62
63CTRL_CMD_DEFINE_RANGE(net_mnc, "mnc", struct gsm_network, network_code, 0, 999);
64CTRL_CMD_DEFINE_RANGE(net_mcc, "mcc", struct gsm_network, country_code, 1, 999);
65CTRL_CMD_VTY_STRING(net_short_name, "short-name", struct gsm_network, name_short);
66CTRL_CMD_VTY_STRING(net_long_name, "long-name", struct gsm_network, name_long);
67
Holger Hans Peter Freyther6ca9f4f2013-01-09 17:30:11 +010068static int verify_net_apply_config(struct ctrl_cmd *cmd, const char *v, void *d)
69{
70 return 0;
71}
72
73static int get_net_apply_config(struct ctrl_cmd *cmd, void *data)
74{
75 cmd->reply = "Write only attribute";
76 return CTRL_CMD_ERROR;
77}
78
79static int set_net_apply_config(struct ctrl_cmd *cmd, void *data)
80{
81 struct gsm_network *net = cmd->node;
82 struct gsm_bts *bts;
83
84 llist_for_each_entry(bts, &net->bts_list, list) {
85 if (!is_ipaccess_bts(bts))
86 continue;
87
88 ipaccess_drop_oml(bts);
89 }
90
91 cmd->reply = "Tried to drop the BTS";
92 return CTRL_CMD_REPLY;
93}
94
95CTRL_CMD_DEFINE(net_apply_config, "apply-configuration");
96
Holger Hans Peter Freyther3adb7722014-03-04 17:16:58 +010097static int verify_net_mcc_mnc_apply(struct ctrl_cmd *cmd, const char *value, void *d)
98{
99 char *tmp, *saveptr, *mcc, *mnc;
100
101 tmp = talloc_strdup(cmd, value);
102 if (!tmp)
103 return 1;
104
105 mcc = strtok_r(tmp, ",", &saveptr);
106 mnc = strtok_r(NULL, ",", &saveptr);
107 talloc_free(tmp);
108
109 if (!mcc || !mnc)
110 return 1;
111 return 0;
112}
113
114static int get_net_mcc_mnc_apply(struct ctrl_cmd *cmd, void *data)
115{
116 cmd->reply = "Write only attribute";
117 return CTRL_CMD_ERROR;
118}
119
120static int set_net_mcc_mnc_apply(struct ctrl_cmd *cmd, void *data)
121{
122 struct gsm_network *net = cmd->node;
123 char *tmp, *saveptr, *mcc_str, *mnc_str;
124 int mcc, mnc;
125
126 tmp = talloc_strdup(cmd, cmd->value);
127 if (!tmp)
128 goto oom;
129
130
131 mcc_str = strtok_r(tmp, ",", &saveptr);
132 mnc_str = strtok_r(NULL, ",", &saveptr);
133
134 mcc = atoi(mcc_str);
135 mnc = atoi(mnc_str);
136
137 talloc_free(tmp);
138
139 if (net->network_code == mnc && net->country_code == mcc) {
140 cmd->reply = "Nothing changed";
141 return CTRL_CMD_REPLY;
142 }
143
144 net->network_code = mnc;
145 net->country_code = mcc;
146
147 return set_net_apply_config(cmd, data);
148
149oom:
150 cmd->reply = "OOM";
151 return CTRL_CMD_ERROR;
152}
153CTRL_CMD_DEFINE(net_mcc_mnc_apply, "mcc-mnc-apply");
154
Holger Hans Peter Freytherd092f482014-03-23 11:17:27 +0100155/* TRX related commands below here */
156CTRL_HELPER_GET_INT(trx_max_power, struct gsm_bts_trx, max_power_red);
Holger Hans Peter Freytherd092f482014-03-23 11:17:27 +0100157static int verify_trx_max_power(struct ctrl_cmd *cmd, const char *value, void *_data)
158{
159 int tmp = atoi(value);
160
161 if (tmp < 0 || tmp > 22) {
162 cmd->reply = "Value must be between 0 and 22";
163 return -1;
164 }
165
166 if (tmp & 1) {
167 cmd->reply = "Value must be even";
168 return -1;
169 }
170
171 return 0;
172}
Holger Hans Peter Freyther8a158bb2014-03-26 14:24:42 +0100173
174static int set_trx_max_power(struct ctrl_cmd *cmd, void *_data)
175{
176 struct gsm_bts_trx *trx = cmd->node;
177 int old_power;
178
179 /* remember the old value, set the new one */
180 old_power = trx->max_power_red;
181 trx->max_power_red = atoi(cmd->value);
182
183 /* Maybe update the value */
184 if (old_power != trx->max_power_red) {
185 LOGP(DCTRL, LOGL_NOTICE,
186 "%s updating max_pwr_red(%d)\n",
187 gsm_trx_name(trx), trx->max_power_red);
188 abis_nm_update_max_power_red(trx);
189 }
190
191 return get_trx_max_power(cmd, _data);
192}
Holger Hans Peter Freytherd092f482014-03-23 11:17:27 +0100193CTRL_CMD_DEFINE(trx_max_power, "max-power-reduction");
194
Holger Hans Peter Freytherf8c42192013-01-09 17:03:27 +0100195int bsc_base_ctrl_cmds_install(void)
196{
197 int rc = 0;
198 rc |= ctrl_cmd_install(CTRL_NODE_ROOT, &cmd_net_mnc);
199 rc |= ctrl_cmd_install(CTRL_NODE_ROOT, &cmd_net_mcc);
200 rc |= ctrl_cmd_install(CTRL_NODE_ROOT, &cmd_net_short_name);
201 rc |= ctrl_cmd_install(CTRL_NODE_ROOT, &cmd_net_long_name);
Holger Hans Peter Freyther6ca9f4f2013-01-09 17:30:11 +0100202 rc |= ctrl_cmd_install(CTRL_NODE_ROOT, &cmd_net_apply_config);
Holger Hans Peter Freyther3adb7722014-03-04 17:16:58 +0100203 rc |= ctrl_cmd_install(CTRL_NODE_ROOT, &cmd_net_mcc_mnc_apply);
Holger Hans Peter Freytherf8c42192013-01-09 17:03:27 +0100204
Holger Hans Peter Freytherd092f482014-03-23 11:17:27 +0100205 rc |= ctrl_cmd_install(CTRL_NODE_TRX, &cmd_trx_max_power);
Holger Hans Peter Freytherf8c42192013-01-09 17:03:27 +0100206 return rc;
207}