blob: b35d53754bb843ccc7230f1af580216a339e6a3f [file] [log] [blame]
Holger Hans Peter Freyther5ccab102010-06-30 14:33:01 +08001/* (C) 2008-2009 by Harald Welte <laforge@gnumonks.org>
2 * (C) 2009-2010 by Holger Hans Peter Freyther <zecke@selfish.org>
3 * (C) 2009-2010 by On-Waves
4 * All Rights Reserved
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License along
17 * with this program; if not, write to the Free Software Foundation, Inc.,
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19 *
20 */
21
Holger Hans Peter Freythercacbc732010-06-30 14:59:23 +080022#include <openbsc/debug.h>
Holger Hans Peter Freyther5ccab102010-06-30 14:33:01 +080023#include <openbsc/gsm_data.h>
Holger Hans Peter Freythercacbc732010-06-30 14:59:23 +080024#include <openbsc/osmo_bsc_rf.h>
Holger Hans Peter Freyther7a2c86b2010-08-26 15:38:42 +080025#include <openbsc/vty.h>
Holger Hans Peter Freyther5ccab102010-06-30 14:33:01 +080026
Holger Hans Peter Freythercacbc732010-06-30 14:59:23 +080027#include <osmocore/talloc.h>
Harald Welte2c869ef2010-08-25 19:43:54 +020028#include <osmocore/process.h>
Holger Hans Peter Freythercacbc732010-06-30 14:59:23 +080029
Harald Welted5db12c2010-08-03 15:11:51 +020030#include <osmocom/sccp/sccp.h>
Holger Hans Peter Freyther30e1ae92010-07-30 02:53:14 +080031
Holger Hans Peter Freythercacbc732010-06-30 14:59:23 +080032#define _GNU_SOURCE
33#include <getopt.h>
34
35#include <stdio.h>
36#include <stdlib.h>
37#include <time.h>
38
39#include "bscconfig.h"
40
41static struct log_target *stderr_target;
Holger Hans Peter Freyther5ccab102010-06-30 14:33:01 +080042struct gsm_network *bsc_gsmnet = 0;
Holger Hans Peter Freythercacbc732010-06-30 14:59:23 +080043static const char *config_file = "openbsc.cfg";
44static const char *rf_ctl = NULL;
Holger Hans Peter Freyther38158fb2010-09-11 13:28:42 +080045extern const char *openbsc_copyright;
Harald Welte2c869ef2010-08-25 19:43:54 +020046static int daemonize = 0;
Holger Hans Peter Freythercacbc732010-06-30 14:59:23 +080047
48extern void bsc_vty_init(void);
49extern int bsc_bootstrap_network(int (*layer4)(struct gsm_network *, int, void *), const char *cfg_file);
50
51static void print_usage()
52{
53 printf("Usage: bsc_msc_ip\n");
54}
55
56static void print_help()
57{
58 printf(" Some useful help...\n");
59 printf(" -h --help this text\n");
Harald Welte2c869ef2010-08-25 19:43:54 +020060 printf(" -D --daemonize Fork the process into a background daemon\n");
Holger Hans Peter Freythercacbc732010-06-30 14:59:23 +080061 printf(" -d option --debug=DRLL:DCC:DMM:DRR:DRSL:DNM enable debugging\n");
62 printf(" -s --disable-color\n");
63 printf(" -T --timestamp. Print a timestamp in the debug output.\n");
64 printf(" -c --config-file filename The config file to use.\n");
65 printf(" -l --local=IP. The local address of the MGCP.\n");
66 printf(" -e --log-level number. Set a global loglevel.\n");
67 printf(" -r --rf-ctl NAME. A unix domain socket to listen for cmds.\n");
68 printf(" -t --testmode. A special mode to provoke failures at the MSC.\n");
69}
70
71static void handle_options(int argc, char** argv)
72{
73 while (1) {
74 int option_index = 0, c;
75 static struct option long_options[] = {
76 {"help", 0, 0, 'h'},
77 {"debug", 1, 0, 'd'},
Harald Welte2c869ef2010-08-25 19:43:54 +020078 {"daemonize", 0, 0, 'D'},
Holger Hans Peter Freythercacbc732010-06-30 14:59:23 +080079 {"config-file", 1, 0, 'c'},
80 {"disable-color", 0, 0, 's'},
81 {"timestamp", 0, 0, 'T'},
82 {"msc", 1, 0, 'm'},
83 {"local", 1, 0, 'l'},
84 {"log-level", 1, 0, 'e'},
85 {"rf-ctl", 1, 0, 'r'},
86 {"testmode", 0, 0, 't'},
87 {0, 0, 0, 0}
88 };
89
Harald Welte2c869ef2010-08-25 19:43:54 +020090 c = getopt_long(argc, argv, "hd:DsTc:e:r:t",
Holger Hans Peter Freythercacbc732010-06-30 14:59:23 +080091 long_options, &option_index);
92 if (c == -1)
93 break;
94
95 switch (c) {
96 case 'h':
97 print_usage();
98 print_help();
99 exit(0);
100 case 's':
101 log_set_use_color(stderr_target, 0);
102 break;
103 case 'd':
104 log_parse_category_mask(stderr_target, optarg);
105 break;
Harald Welte2c869ef2010-08-25 19:43:54 +0200106 case 'D':
107 daemonize = 1;
108 break;
Holger Hans Peter Freythercacbc732010-06-30 14:59:23 +0800109 case 'c':
110 config_file = strdup(optarg);
111 break;
112 case 'T':
113 log_set_print_timestamp(stderr_target, 1);
114 break;
115 case 'P':
116 ipacc_rtp_direct = 0;
117 break;
118 case 'e':
119 log_set_log_level(stderr_target, atoi(optarg));
120 break;
121 case 'r':
122 rf_ctl = optarg;
123 break;
124 default:
125 /* ignore */
126 break;
127 }
128 }
129}
130
131extern int bts_model_unknown_init(void);
132extern int bts_model_bs11_init(void);
133extern int bts_model_nanobts_init(void);
134
135extern enum node_type bsc_vty_go_parent(struct vty *vty);
136
137static struct vty_app_info vty_info = {
138 .name = "OpenBSC Osmo BSC",
139 .version = PACKAGE_VERSION,
140 .go_parent_cb = bsc_vty_go_parent,
Holger Hans Peter Freyther7a2c86b2010-08-26 15:38:42 +0800141 .is_config_node = bsc_vty_is_config_node,
Holger Hans Peter Freythercacbc732010-06-30 14:59:23 +0800142};
143
Holger Hans Peter Freyther5ccab102010-06-30 14:33:01 +0800144
145int main(int argc, char **argv)
146{
Holger Hans Peter Freythercacbc732010-06-30 14:59:23 +0800147 char *msc;
148 int rc;
149
150 log_init(&log_info);
151 tall_bsc_ctx = talloc_named_const(NULL, 1, "openbsc");
152 stderr_target = log_target_create_stderr();
153 log_add_target(stderr_target);
154
155 bts_model_unknown_init();
156 bts_model_bs11_init();
157 bts_model_nanobts_init();
158
159 /* enable filters */
160 log_set_all_filter(stderr_target, 1);
161
162 /* This needs to precede handle_options() */
Holger Hans Peter Freyther38158fb2010-09-11 13:28:42 +0800163 vty_info.copyright = openbsc_copyright;
Holger Hans Peter Freythercacbc732010-06-30 14:59:23 +0800164 vty_init(&vty_info);
165 bsc_vty_init();
166
167 /* parse options */
168 handle_options(argc, argv);
169
170 /* seed the PRNG */
171 srand(time(NULL));
172
Holger Hans Peter Freyther30e1ae92010-07-30 02:53:14 +0800173 /* initialize SCCP */
174 sccp_set_log_area(DSCCP);
175
Holger Hans Peter Freythercacbc732010-06-30 14:59:23 +0800176
177 rc = bsc_bootstrap_network(NULL, config_file);
178 if (rc < 0) {
179 fprintf(stderr, "Bootstrapping the network failed. exiting.\n");
180 exit(1);
181 }
182
183 if (rf_ctl) {
184 struct osmo_bsc_rf *rf;
185 rf = osmo_bsc_rf_create(rf_ctl, bsc_gsmnet);
186 if (!rf) {
187 fprintf(stderr, "Failed to create the RF service.\n");
188 exit(1);
189 }
190 }
191
Harald Welte2c869ef2010-08-25 19:43:54 +0200192 if (daemonize) {
193 rc = osmo_daemonize();
194 if (rc < 0) {
195 perror("Error during daemonize");
196 exit(1);
197 }
198 }
Holger Hans Peter Freythercacbc732010-06-30 14:59:23 +0800199
200 while (1) {
201 bsc_select_main(0);
202 }
203
Holger Hans Peter Freyther5ccab102010-06-30 14:33:01 +0800204 return 0;
205}