blob: 93e9ee397fa5a1209bdc13ff0eca26cf64c97a65 [file] [log] [blame]
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +08001/* Bloated main routine, refactor */
2/*
Holger Hans Peter Freytherc8405692011-01-02 20:24:08 +01003 * (C) 2010-2011 by Holger Hans Peter Freyther <zecke@selfish.org>
4 * (C) 2010-2011 by On-Waves
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +08005 * All Rights Reserved
6 *
Holger Hans Peter Freytherde56c222011-01-16 17:45:14 +01007 * 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
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +080010 * (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
Holger Hans Peter Freytherde56c222011-01-16 17:45:14 +010015 * GNU Affero General Public License for more details.
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +080016 *
Holger Hans Peter Freytherde56c222011-01-16 17:45:14 +010017 * 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/>.
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +080019 *
20 */
21
22#include <mtp_data.h>
Holger Hans Peter Freytherb38b33b2010-11-26 21:21:04 +010023#include <mtp_level3.h>
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +080024#include <mtp_pcap.h>
25#include <thread.h>
26#include <bss_patch.h>
27#include <bssap_sccp.h>
28#include <bsc_data.h>
Holger Hans Peter Freythercbf7d182010-07-31 05:25:35 +080029#include <cellmgr_debug.h>
Holger Hans Peter Freytherb3e10682010-09-30 01:57:45 +080030#include <bsc_sccp.h>
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +080031
Holger Hans Peter Freythercbf7d182010-07-31 05:25:35 +080032#include <osmocore/talloc.h>
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +080033
Holger Hans Peter Freythercbf7d182010-07-31 05:25:35 +080034#include <osmocom/vty/vty.h>
Holger Hans Peter Freytherfdae5c92010-09-30 01:01:03 +080035#include <osmocom/vty/telnet_interface.h>
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +080036
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +080037#include <sys/stat.h>
38#include <sys/types.h>
39
40#include <fcntl.h>
41#include <signal.h>
42#include <stdio.h>
43#include <stdlib.h>
44#include <string.h>
45#include <assert.h>
46#include <unistd.h>
47
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +080048#ifndef _GNU_SOURCE
49#define _GNU_SOURCE
50#endif
51#include <getopt.h>
52
Holger Hans Peter Freyther4bbfa272010-09-15 20:53:56 +080053#undef PACKAGE_NAME
54#undef PACKAGE_VERSION
55#undef PACKAGE_BUGREPORT
56#undef PACKAGE_TARNAME
57#undef PACKAGE_STRING
58#include <cellmgr_config.h>
59
Holger Hans Peter Freythercbf7d182010-07-31 05:25:35 +080060static struct log_target *stderr_target;
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +080061
62static char *config = "cellmgr_ng.cfg";
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +080063
Holger Hans Peter Freyther2ff47b82011-02-15 20:25:10 +010064struct bsc_data *bsc;
Holger Hans Peter Freyther7942abc2010-09-30 00:34:46 +080065extern void cell_vty_init(void);
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +080066
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +080067static void print_usage()
68{
69 printf("Usage: cellmgr_ng\n");
70}
71
72static void sigint()
73{
74 static pthread_mutex_t exit_mutex = PTHREAD_MUTEX_INITIALIZER;
75 static int handled = 0;
76
Holger Hans Peter Freyther89fa11a2011-02-10 18:26:07 +010077 struct mtp_link_set *set;
78
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +080079 /* failed to lock */
80 if (pthread_mutex_trylock(&exit_mutex) != 0)
81 return;
82 if (handled)
83 goto out;
84
85 printf("Terminating.\n");
86 handled = 1;
Holger Hans Peter Freyther2ff47b82011-02-15 20:25:10 +010087 if (bsc && bsc->setup) {
Holger Hans Peter Freyther599c9a42011-02-15 11:18:38 +010088 llist_for_each_entry(set, &bsc->linksets, entry)
Holger Hans Peter Freyther89fa11a2011-02-10 18:26:07 +010089 link_shutdown_all(set);
90 }
91
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +080092 exit(0);
93
94out:
95 pthread_mutex_unlock(&exit_mutex);
96}
97
98static void sigusr2()
99{
100 printf("Closing the MSC connection on demand.\n");
Holger Hans Peter Freyther2ff47b82011-02-15 20:25:10 +0100101 msc_close_connection(&bsc->msc_forward);
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +0800102}
103
104static void print_help()
105{
106 printf(" Some useful help...\n");
107 printf(" -h --help this text\n");
108 printf(" -c --config=CFG The config file to use.\n");
109 printf(" -p --pcap=FILE. Write MSUs to the PCAP file.\n");
110 printf(" -c --once. Send the SLTM msg only once.\n");
Holger Hans Peter Freyther4bbfa272010-09-15 20:53:56 +0800111 printf(" -v --version. Print the version number\n");
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +0800112}
113
114static void handle_options(int argc, char **argv)
115{
116 while (1) {
117 int option_index = 0, c;
118 static struct option long_options[] = {
119 {"help", 0, 0, 'h'},
120 {"config", 1, 0, 'c'},
121 {"pcap", 1, 0, 'p'},
Holger Hans Peter Freyther4bbfa272010-09-15 20:53:56 +0800122 {"version", 0, 0, 0},
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +0800123 {0, 0, 0, 0},
124 };
125
Holger Hans Peter Freythereefd72c2010-12-17 16:22:31 +0100126 c = getopt_long(argc, argv, "hc:p:v",
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +0800127 long_options, &option_index);
128 if (c == -1)
129 break;
130
131 switch (c) {
132 case 'h':
133 print_usage();
134 print_help();
135 exit(0);
136 case 'p':
Holger Hans Peter Freyther2ff47b82011-02-15 20:25:10 +0100137 if (bsc->pcap_fd >= 0)
138 close(bsc->pcap_fd);
139 bsc->pcap_fd = open(optarg, O_WRONLY | O_TRUNC | O_CREAT, S_IRUSR | S_IWUSR | S_IRGRP| S_IROTH);
140 if (bsc->pcap_fd < 0) {
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +0800141 fprintf(stderr, "Failed to open PCAP file.\n");
142 exit(0);
143 }
Holger Hans Peter Freyther2ff47b82011-02-15 20:25:10 +0100144 mtp_pcap_write_header(bsc->pcap_fd);
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +0800145 break;
146 case 'c':
147 config = optarg;
148 break;
Holger Hans Peter Freyther4bbfa272010-09-15 20:53:56 +0800149 case 'v':
150 printf("This is %s version %s.\n", PACKAGE, VERSION);
151 exit(0);
152 break;
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +0800153 default:
154 fprintf(stderr, "Unknown option.\n");
155 break;
156 }
157 }
158}
159
Holger Hans Peter Freythere86c02e2011-02-10 15:32:14 +0100160static void bsc_msc_forward_init(struct bsc_data *bsc,
161 struct bsc_msc_forward *msc)
162{
163 INIT_LLIST_HEAD(&msc->sccp_connections);
164
165 msc->bsc_data = bsc;
166 msc->msc_address = "127.0.0.1";
167 msc->ping_time = 20;
168 msc->pong_time = 5;
169 msc->msc_time = 20;
170}
171
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +0800172int main(int argc, char **argv)
173{
Holger Hans Peter Freytherfdae5c92010-09-30 01:01:03 +0800174 int rc;
Holger Hans Peter Freyther89fa11a2011-02-10 18:26:07 +0100175 struct mtp_link_set *set;
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +0800176
Holger Hans Peter Freyther7942abc2010-09-30 00:34:46 +0800177
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +0800178 thread_init();
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +0800179
Holger Hans Peter Freythercbf7d182010-07-31 05:25:35 +0800180 log_init(&log_info);
181 stderr_target = log_target_create_stderr();
182 log_add_target(stderr_target);
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +0800183
184 /* enable filters */
Holger Hans Peter Freythercbf7d182010-07-31 05:25:35 +0800185 log_set_all_filter(stderr_target, 1);
186 log_set_category_filter(stderr_target, DINP, 1, LOGL_INFO);
187 log_set_category_filter(stderr_target, DSCCP, 1, LOGL_INFO);
188 log_set_category_filter(stderr_target, DMSC, 1, LOGL_INFO);
189 log_set_category_filter(stderr_target, DMGCP, 1, LOGL_INFO);
190 log_set_print_timestamp(stderr_target, 1);
191 log_set_use_color(stderr_target, 0);
192
193 sccp_set_log_area(DSCCP);
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +0800194
Holger Hans Peter Freyther2ff47b82011-02-15 20:25:10 +0100195 bsc = bsc_data_create();
196 if (!bsc)
197 return -1;
198 bsc->app = APP_CELLMGR;
199
Holger Hans Peter Freythere86c02e2011-02-10 15:32:14 +0100200 /* msc data */
Holger Hans Peter Freyther2ff47b82011-02-15 20:25:10 +0100201 bsc_msc_forward_init(bsc, &bsc->msc_forward);
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +0800202
203 handle_options(argc, argv);
204
205 signal(SIGPIPE, SIG_IGN);
206 signal(SIGINT, sigint);
207 signal(SIGUSR2, sigusr2);
208 srand(time(NULL));
209
210 cell_vty_init();
Holger Hans Peter Freythercbf7d182010-07-31 05:25:35 +0800211 if (vty_read_config_file(config, NULL) < 0) {
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +0800212 fprintf(stderr, "Failed to read the VTY config.\n");
213 return -1;
214 }
215
Holger Hans Peter Freytherfdae5c92010-09-30 01:01:03 +0800216 rc = telnet_init(NULL, NULL, 4242);
217 if (rc < 0)
218 return rc;
219
Holger Hans Peter Freyther2ff47b82011-02-15 20:25:10 +0100220 set = link_init(bsc);
Holger Hans Peter Freyther89fa11a2011-02-10 18:26:07 +0100221 if (!set)
Holger Hans Peter Freythera99b04b2011-01-02 11:23:54 +0100222 return -1;
Holger Hans Peter Freyther89fa11a2011-02-10 18:26:07 +0100223
Holger Hans Peter Freyther2ff47b82011-02-15 20:25:10 +0100224 set->fw = &bsc->msc_forward;
225 bsc->msc_forward.bsc = set;
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +0800226
227 while (1) {
228 bsc_select_main(0);
229 }
230
231 return 0;
232}
233