blob: e5972f1e232d460cdb4e2f52ca395bd8e33d94d4 [file] [log] [blame]
Neels Hofmeyrc69ee852016-05-10 12:50:31 +02001/* Code used by both libbsc and libmsc (common_cs means "BSC or MSC").
2 *
3 * (C) 2016 by sysmocom s.m.f.c. <info@sysmocom.de>
Neels Hofmeyrb90eabf2016-05-11 18:48:39 +02004 * (C) 2008-2010 by Harald Welte <laforge@gnumonks.org>
Neels Hofmeyrc69ee852016-05-10 12:50:31 +02005 * 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 */
Neels Hofmeyrb90eabf2016-05-11 18:48:39 +020021
Neels Hofmeyr06d39fd2016-05-12 01:16:58 +020022#include <osmocom/core/utils.h>
23
24#include <osmocom/vty/command.h>
25#include <osmocom/vty/logging.h>
26#include <osmocom/vty/stats.h>
27
Neels Hofmeyr90843962017-09-04 15:04:35 +020028#include <osmocom/msc/vty.h>
Neels Hofmeyr06d39fd2016-05-12 01:16:58 +020029
Neels Hofmeyr90843962017-09-04 15:04:35 +020030#include <osmocom/msc/gsm_data.h>
31#include <osmocom/msc/gsm_subscriber.h>
Neels Hofmeyr06d39fd2016-05-12 01:16:58 +020032
33struct cmd_node net_node = {
34 GSMNET_NODE,
35 "%s(config-net)# ",
36 1,
37};
38
39#define NETWORK_STR "Configure the GSM network\n"
40#define CODE_CMD_STR "Code commands\n"
41#define NAME_CMD_STR "Name Commands\n"
42#define NAME_STR "Name to use\n"
43
44DEFUN(cfg_net,
45 cfg_net_cmd,
46 "network", NETWORK_STR)
47{
48 vty->index = gsmnet_from_vty(vty);
49 vty->node = GSMNET_NODE;
50
51 return CMD_SUCCESS;
52}
53
54DEFUN(cfg_net_ncc,
55 cfg_net_ncc_cmd,
56 "network country code <1-999>",
57 "Set the GSM network country code\n"
58 "Country commands\n"
59 CODE_CMD_STR
60 "Network Country Code to use\n")
61{
62 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
63
64 gsmnet->country_code = atoi(argv[0]);
65
66 return CMD_SUCCESS;
67}
68
69DEFUN(cfg_net_mnc,
70 cfg_net_mnc_cmd,
71 "mobile network code <0-999>",
72 "Set the GSM mobile network code\n"
73 "Network Commands\n"
74 CODE_CMD_STR
75 "Mobile Network Code to use\n")
76{
77 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
78
79 gsmnet->network_code = atoi(argv[0]);
80
81 return CMD_SUCCESS;
82}
83
84DEFUN(cfg_net_name_short,
85 cfg_net_name_short_cmd,
86 "short name NAME",
87 "Set the short GSM network name\n" NAME_CMD_STR NAME_STR)
88{
89 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
90
Harald Welte4a824ca2017-05-29 13:54:27 +020091 osmo_talloc_replace_string(gsmnet, &gsmnet->name_short, argv[0]);
Neels Hofmeyr06d39fd2016-05-12 01:16:58 +020092 return CMD_SUCCESS;
93}
94
95DEFUN(cfg_net_name_long,
96 cfg_net_name_long_cmd,
97 "long name NAME",
98 "Set the long GSM network name\n" NAME_CMD_STR NAME_STR)
99{
100 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
101
Harald Welte4a824ca2017-05-29 13:54:27 +0200102 osmo_talloc_replace_string(gsmnet, &gsmnet->name_long, argv[0]);
Neels Hofmeyr06d39fd2016-05-12 01:16:58 +0200103 return CMD_SUCCESS;
104}
105
106DEFUN(cfg_net_auth_policy,
107 cfg_net_auth_policy_cmd,
108 "auth policy (closed|accept-all|regexp|token)",
109 "Authentication (not cryptographic)\n"
110 "Set the GSM network authentication policy\n"
111 "Require the MS to be activated in HLR\n"
112 "Accept all MS, whether in HLR or not\n"
113 "Use regular expression for IMSI authorization decision\n"
114 "Use SMS-token based authentication\n")
115{
116 enum gsm_auth_policy policy = gsm_auth_policy_parse(argv[0]);
117 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
118
119 gsmnet->auth_policy = policy;
120
121 return CMD_SUCCESS;
122}
123
124DEFUN(cfg_net_authorize_regexp, cfg_net_authorize_regexp_cmd,
125 "authorized-regexp REGEXP",
126 "Set regexp for IMSI which will be used for authorization decision\n"
127 "Regular expression, IMSIs matching it are allowed to use the network\n")
128{
129 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
130 if (gsm_parse_reg(gsmnet, &gsmnet->authorized_regexp,
131 &gsmnet->authorized_reg_str, argc, argv) != 0) {
132 vty_out(vty, "%%Failed to parse the authorized-regexp: '%s'%s",
133 argv[0], VTY_NEWLINE);
134 return CMD_WARNING;
135 }
136
137 return CMD_SUCCESS;
138}
139
Neels Hofmeyr06d39fd2016-05-12 01:16:58 +0200140DEFUN(cfg_net_encryption,
141 cfg_net_encryption_cmd,
Harald Welte7b222aa2017-12-23 19:30:32 +0100142 "encryption a5 <0-3> [<0-3>] [<0-3>] [<0-3>]",
Neels Hofmeyr06d39fd2016-05-12 01:16:58 +0200143 "Encryption options\n"
Harald Welte7b222aa2017-12-23 19:30:32 +0100144 "GSM A5 Air Interface Encryption\n"
145 "A5/n Algorithm Number\n"
146 "A5/n Algorithm Number\n"
147 "A5/n Algorithm Number\n"
148 "A5/n Algorithm Number\n")
Neels Hofmeyr06d39fd2016-05-12 01:16:58 +0200149{
150 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welte7b222aa2017-12-23 19:30:32 +0100151 unsigned int i;
Neels Hofmeyr06d39fd2016-05-12 01:16:58 +0200152
Harald Welte7b222aa2017-12-23 19:30:32 +0100153 gsmnet->a5_encryption_mask = 0;
154 for (i = 0; i < argc; i++)
155 gsmnet->a5_encryption_mask |= (1 << atoi(argv[i]));
Neels Hofmeyr06d39fd2016-05-12 01:16:58 +0200156
157 return CMD_SUCCESS;
158}
159
Harald Welte2483f1b2016-06-19 18:06:02 +0200160DEFUN(cfg_net_authentication,
161 cfg_net_authentication_cmd,
162 "authentication (optional|required)",
163 "Whether to enforce MS authentication in 2G\n"
164 "Allow MS to attach via 2G BSC without authentication\n"
165 "Always do authentication\n")
166{
167 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
168
169 gsmnet->authentication_required = (argv[0][0] == 'r') ? true : false;
170
171 return CMD_SUCCESS;
172}
173
Neels Hofmeyr06d39fd2016-05-12 01:16:58 +0200174DEFUN(cfg_net_rrlp_mode, cfg_net_rrlp_mode_cmd,
175 "rrlp mode (none|ms-based|ms-preferred|ass-preferred)",
176 "Radio Resource Location Protocol\n"
177 "Set the Radio Resource Location Protocol Mode\n"
178 "Don't send RRLP request\n"
179 "Request MS-based location\n"
180 "Request any location, prefer MS-based\n"
181 "Request any location, prefer MS-assisted\n")
182{
183 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
184
185 gsmnet->rrlp.mode = rrlp_mode_parse(argv[0]);
186
187 return CMD_SUCCESS;
188}
189
190DEFUN(cfg_net_mm_info, cfg_net_mm_info_cmd,
191 "mm info (0|1)",
192 "Mobility Management\n"
193 "Send MM INFO after LOC UPD ACCEPT\n"
194 "Disable\n" "Enable\n")
195{
196 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
197
198 gsmnet->send_mm_info = atoi(argv[0]);
199
200 return CMD_SUCCESS;
201}
202
Neels Hofmeyr640b7942016-05-14 03:24:41 +0200203DEFUN(cfg_net_timezone,
204 cfg_net_timezone_cmd,
205 "timezone <-19-19> (0|15|30|45)",
206 "Set the Timezone Offset of the network\n"
207 "Timezone offset (hours)\n"
208 "Timezone offset (00 minutes)\n"
209 "Timezone offset (15 minutes)\n"
210 "Timezone offset (30 minutes)\n"
211 "Timezone offset (45 minutes)\n"
212 )
213{
214 struct gsm_network *net = vty->index;
215 int tzhr = atoi(argv[0]);
216 int tzmn = atoi(argv[1]);
217
218 net->tz.hr = tzhr;
219 net->tz.mn = tzmn;
220 net->tz.dst = 0;
221 net->tz.override = 1;
222
223 return CMD_SUCCESS;
224}
225
226DEFUN(cfg_net_timezone_dst,
227 cfg_net_timezone_dst_cmd,
228 "timezone <-19-19> (0|15|30|45) <0-2>",
229 "Set the Timezone Offset of the network\n"
230 "Timezone offset (hours)\n"
231 "Timezone offset (00 minutes)\n"
232 "Timezone offset (15 minutes)\n"
233 "Timezone offset (30 minutes)\n"
234 "Timezone offset (45 minutes)\n"
235 "DST offset (hours)\n"
236 )
237{
238 struct gsm_network *net = vty->index;
239 int tzhr = atoi(argv[0]);
240 int tzmn = atoi(argv[1]);
241 int tzdst = atoi(argv[2]);
242
243 net->tz.hr = tzhr;
244 net->tz.mn = tzmn;
245 net->tz.dst = tzdst;
246 net->tz.override = 1;
247
248 return CMD_SUCCESS;
249}
250
251DEFUN(cfg_net_no_timezone,
252 cfg_net_no_timezone_cmd,
253 "no timezone",
254 NO_STR
255 "Disable network timezone override, use system tz\n")
256{
257 struct gsm_network *net = vty->index;
258
259 net->tz.override = 0;
260
261 return CMD_SUCCESS;
262}
263
Neels Hofmeyre2f24d52017-05-08 15:12:20 +0200264DEFUN(cfg_net_per_loc_upd, cfg_net_per_loc_upd_cmd,
265 "periodic location update <6-1530>",
266 "Periodic Location Updating Interval\n"
267 "Periodic Location Updating Interval\n"
268 "Periodic Location Updating Interval\n"
269 "Periodic Location Updating Interval in Minutes\n")
270{
271 struct gsm_network *net = vty->index;
272
273 net->t3212 = atoi(argv[0]) / 6;
274
275 return CMD_SUCCESS;
276}
277
278DEFUN(cfg_net_no_per_loc_upd, cfg_net_no_per_loc_upd_cmd,
279 "no periodic location update",
280 NO_STR
281 "Periodic Location Updating Interval\n"
282 "Periodic Location Updating Interval\n"
283 "Periodic Location Updating Interval\n")
284{
285 struct gsm_network *net = vty->index;
286
287 net->t3212 = 0;
288
289 return CMD_SUCCESS;
290}
291
Neels Hofmeyrb90eabf2016-05-11 18:48:39 +0200292static struct gsm_network *vty_global_gsm_network = NULL;
293
294/* initialize VTY elements used in both BSC and MSC */
Neels Hofmeyr06d39fd2016-05-12 01:16:58 +0200295int common_cs_vty_init(struct gsm_network *network,
296 int (* config_write_net )(struct vty *))
Neels Hofmeyrb90eabf2016-05-11 18:48:39 +0200297{
298 OSMO_ASSERT(vty_global_gsm_network == NULL);
299 vty_global_gsm_network = network;
Neels Hofmeyr06d39fd2016-05-12 01:16:58 +0200300
Neels Hofmeyre2f24d52017-05-08 15:12:20 +0200301 osmo_stats_vty_add_cmds();
302
Neels Hofmeyr06d39fd2016-05-12 01:16:58 +0200303 install_element(CONFIG_NODE, &cfg_net_cmd);
304 install_node(&net_node, config_write_net);
Neels Hofmeyr06d39fd2016-05-12 01:16:58 +0200305 install_element(GSMNET_NODE, &cfg_net_ncc_cmd);
306 install_element(GSMNET_NODE, &cfg_net_mnc_cmd);
307 install_element(GSMNET_NODE, &cfg_net_name_short_cmd);
308 install_element(GSMNET_NODE, &cfg_net_name_long_cmd);
309 install_element(GSMNET_NODE, &cfg_net_auth_policy_cmd);
310 install_element(GSMNET_NODE, &cfg_net_authorize_regexp_cmd);
Neels Hofmeyr06d39fd2016-05-12 01:16:58 +0200311 install_element(GSMNET_NODE, &cfg_net_encryption_cmd);
Harald Welte2483f1b2016-06-19 18:06:02 +0200312 install_element(GSMNET_NODE, &cfg_net_authentication_cmd);
Neels Hofmeyr06d39fd2016-05-12 01:16:58 +0200313 install_element(GSMNET_NODE, &cfg_net_rrlp_mode_cmd);
314 install_element(GSMNET_NODE, &cfg_net_mm_info_cmd);
Neels Hofmeyr640b7942016-05-14 03:24:41 +0200315 install_element(GSMNET_NODE, &cfg_net_timezone_cmd);
316 install_element(GSMNET_NODE, &cfg_net_timezone_dst_cmd);
317 install_element(GSMNET_NODE, &cfg_net_no_timezone_cmd);
Neels Hofmeyre2f24d52017-05-08 15:12:20 +0200318 install_element(GSMNET_NODE, &cfg_net_per_loc_upd_cmd);
319 install_element(GSMNET_NODE, &cfg_net_no_per_loc_upd_cmd);
Neels Hofmeyr06d39fd2016-05-12 01:16:58 +0200320
321 return CMD_SUCCESS;
Neels Hofmeyrb90eabf2016-05-11 18:48:39 +0200322}
323
324struct gsm_network *gsmnet_from_vty(struct vty *v)
325{
326 /* It can't hurt to force callers to continue to pass the vty instance
327 * to this function, in case we'd like to retrieve the global
328 * gsm_network instance from the vty at some point in the future. But
329 * until then, just return the global pointer, which should have been
330 * initialized by common_cs_vty_init().
331 */
332 OSMO_ASSERT(vty_global_gsm_network);
333 return vty_global_gsm_network;
334}