blob: f13d4dd318875270958479c6b878764f119f9cde [file] [log] [blame]
Holger Hans Peter Freyther594ee9a2010-11-16 11:03:19 +01001/* Relay UDT/all SCCP messages */
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 Freyther594ee9a2010-11-16 11:03:19 +01005 * 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 Freyther594ee9a2010-11-16 11:03:19 +010010 * (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 Freyther594ee9a2010-11-16 11:03:19 +010016 *
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 Freyther594ee9a2010-11-16 11:03:19 +010019 *
20 */
21
22#include <mtp_data.h>
Holger Hans Peter Freyther396282e2010-12-08 10:08:14 +010023#include <mtp_level3.h>
Holger Hans Peter Freyther594ee9a2010-11-16 11:03:19 +010024#include <mtp_pcap.h>
25#include <thread.h>
26#include <bsc_data.h>
27#include <snmp_mtp.h>
28#include <cellmgr_debug.h>
29
30#include <osmocore/talloc.h>
31
32#include <osmocom/vty/vty.h>
33#include <osmocom/vty/telnet_interface.h>
34
35#include <sys/stat.h>
36#include <sys/types.h>
37
38#include <fcntl.h>
39#include <signal.h>
40#include <stdio.h>
41#include <stdlib.h>
42#include <string.h>
43#include <assert.h>
44#include <unistd.h>
45
46#ifndef _GNU_SOURCE
47#define _GNU_SOURCE
48#endif
49#include <getopt.h>
50
51#undef PACKAGE_NAME
52#undef PACKAGE_VERSION
53#undef PACKAGE_BUGREPORT
54#undef PACKAGE_TARNAME
55#undef PACKAGE_STRING
56#include <cellmgr_config.h>
57
58static struct log_target *stderr_target;
59
60static char *config = "udt_relay.cfg";
61
62struct bsc_data bsc;
63extern void cell_vty_init(void);
64
Holger Hans Peter Freyther594ee9a2010-11-16 11:03:19 +010065/*
66 * methods called from the MTP Level3 part
67 */
Holger Hans Peter Freyther569f1e12011-01-02 18:47:49 +010068void mtp_link_set_forward_sccp(struct mtp_link_set *link, struct msgb *_msg, int sls)
Holger Hans Peter Freyther594ee9a2010-11-16 11:03:19 +010069{
70 msc_send_direct(&bsc, _msg);
71}
72
Holger Hans Peter Freytherc8405692011-01-02 20:24:08 +010073void mtp_linkset_down(struct mtp_link_set *set)
Holger Hans Peter Freyther594ee9a2010-11-16 11:03:19 +010074{
Holger Hans Peter Freytherc8405692011-01-02 20:24:08 +010075 set->available = 0;
76 mtp_link_set_stop(set);
Holger Hans Peter Freyther594ee9a2010-11-16 11:03:19 +010077
Holger Hans Peter Freyther594ee9a2010-11-16 11:03:19 +010078 /* If we have an A link send a reset to the MSC */
Holger Hans Peter Freytherc8405692011-01-02 20:24:08 +010079 msc_send_reset(set->bsc);
Holger Hans Peter Freyther594ee9a2010-11-16 11:03:19 +010080}
81
Holger Hans Peter Freytherc8405692011-01-02 20:24:08 +010082void mtp_linkset_up(struct mtp_link_set *set)
Holger Hans Peter Freyther594ee9a2010-11-16 11:03:19 +010083{
Holger Hans Peter Freytherc8405692011-01-02 20:24:08 +010084 set->available = 1;
85 mtp_link_set_reset(set);
Holger Hans Peter Freyther594ee9a2010-11-16 11:03:19 +010086}
87
88static void print_usage()
89{
90 printf("Usage: cellmgr_ng\n");
91}
92
93static void sigint()
94{
95 static pthread_mutex_t exit_mutex = PTHREAD_MUTEX_INITIALIZER;
96 static int handled = 0;
97
98 /* failed to lock */
99 if (pthread_mutex_trylock(&exit_mutex) != 0)
100 return;
101 if (handled)
102 goto out;
103
104 printf("Terminating.\n");
105 handled = 1;
106 if (bsc.setup)
Holger Hans Peter Freytherfe72c162011-01-04 13:21:52 +0100107 link_shutdown_all(bsc.link_set);
Holger Hans Peter Freyther594ee9a2010-11-16 11:03:19 +0100108 exit(0);
109
110out:
111 pthread_mutex_unlock(&exit_mutex);
112}
113
114static void sigusr2()
115{
116 printf("Closing the MSC connection on demand.\n");
117 msc_close_connection(&bsc);
118}
119
120static void print_help()
121{
122 printf(" Some useful help...\n");
123 printf(" -h --help this text\n");
124 printf(" -c --config=CFG The config file to use.\n");
125 printf(" -p --pcap=FILE. Write MSUs to the PCAP file.\n");
126 printf(" -c --once. Send the SLTM msg only once.\n");
127 printf(" -v --version. Print the version number\n");
128}
129
130static void handle_options(int argc, char **argv)
131{
132 while (1) {
133 int option_index = 0, c;
134 static struct option long_options[] = {
135 {"help", 0, 0, 'h'},
136 {"config", 1, 0, 'c'},
137 {"pcap", 1, 0, 'p'},
138 {"version", 0, 0, 0},
139 {0, 0, 0, 0},
140 };
141
142 c = getopt_long(argc, argv, "hc:p:v",
143 long_options, &option_index);
144 if (c == -1)
145 break;
146
147 switch (c) {
148 case 'h':
149 print_usage();
150 print_help();
151 exit(0);
152 case 'p':
Holger Hans Peter Freyther644aafb2011-01-03 23:51:07 +0100153 if (bsc.pcap_fd >= 0)
154 close(bsc.pcap_fd);
155 bsc.pcap_fd = open(optarg, O_WRONLY | O_TRUNC | O_CREAT, S_IRUSR | S_IWUSR | S_IRGRP| S_IROTH);
156 if (bsc.pcap_fd < 0) {
Holger Hans Peter Freyther594ee9a2010-11-16 11:03:19 +0100157 fprintf(stderr, "Failed to open PCAP file.\n");
158 exit(0);
159 }
Holger Hans Peter Freyther644aafb2011-01-03 23:51:07 +0100160 mtp_pcap_write_header(bsc.pcap_fd);
Holger Hans Peter Freyther594ee9a2010-11-16 11:03:19 +0100161 break;
162 case 'c':
163 config = optarg;
164 break;
165 case 'v':
166 printf("This is %s version %s.\n", PACKAGE, VERSION);
167 exit(0);
168 break;
169 default:
170 fprintf(stderr, "Unknown option.\n");
171 break;
172 }
173 }
174}
175
Holger Hans Peter Freyther594ee9a2010-11-16 11:03:19 +0100176int main(int argc, char **argv)
177{
178 int rc;
179 INIT_LLIST_HEAD(&bsc.sccp_connections);
180
181 bsc.dpc = 1;
182 bsc.opc = 0;
Holger Hans Peter Freyther7a725562011-01-01 13:34:58 +0100183 bsc.sccp_opc = -1;
Holger Hans Peter Freyther594ee9a2010-11-16 11:03:19 +0100184 bsc.udp_port = 3456;
185 bsc.udp_ip = NULL;
186 bsc.src_port = 1313;
Holger Hans Peter Freyther396282e2010-12-08 10:08:14 +0100187 bsc.ni_ni = MTP_NI_NATION_NET;
188 bsc.ni_spare = 0;
Holger Hans Peter Freyther594ee9a2010-11-16 11:03:19 +0100189
Holger Hans Peter Freyther569f1e12011-01-02 18:47:49 +0100190 mtp_link_set_init();
Holger Hans Peter Freyther594ee9a2010-11-16 11:03:19 +0100191 thread_init();
192
193 log_init(&log_info);
194 stderr_target = log_target_create_stderr();
195 log_add_target(stderr_target);
196
197 /* enable filters */
198 log_set_all_filter(stderr_target, 1);
199 log_set_category_filter(stderr_target, DINP, 1, LOGL_INFO);
200 log_set_category_filter(stderr_target, DSCCP, 1, LOGL_INFO);
201 log_set_category_filter(stderr_target, DMSC, 1, LOGL_INFO);
202 log_set_category_filter(stderr_target, DMGCP, 1, LOGL_INFO);
203 log_set_print_timestamp(stderr_target, 1);
204 log_set_use_color(stderr_target, 0);
205
206 sccp_set_log_area(DSCCP);
207
208 bsc.setup = 0;
209 bsc.msc_address = "127.0.0.1";
Holger Hans Peter Freyther644aafb2011-01-03 23:51:07 +0100210 bsc.pcap_fd = -1;
211 bsc.udp_reset_timeout = 180;
Holger Hans Peter Freyther594ee9a2010-11-16 11:03:19 +0100212 bsc.ping_time = 20;
213 bsc.pong_time = 5;
214 bsc.msc_time = 20;
Holger Hans Peter Freyther76943812010-11-16 11:14:34 +0100215 bsc.forward_only = 1;
Holger Hans Peter Freyther594ee9a2010-11-16 11:03:19 +0100216
217 handle_options(argc, argv);
218
219 signal(SIGPIPE, SIG_IGN);
220 signal(SIGINT, sigint);
221 signal(SIGUSR2, sigusr2);
222 srand(time(NULL));
223
224 cell_vty_init();
225 if (vty_read_config_file(config, NULL) < 0) {
226 fprintf(stderr, "Failed to read the VTY config.\n");
227 return -1;
228 }
229
230 rc = telnet_init(NULL, NULL, 4242);
231 if (rc < 0)
232 return rc;
233
Holger Hans Peter Freythera99b04b2011-01-02 11:23:54 +0100234 if (link_init(&bsc) != 0)
235 return -1;
Holger Hans Peter Freyther594ee9a2010-11-16 11:03:19 +0100236
237 while (1) {
238 bsc_select_main(0);
239 }
240
241 return 0;
242}
243
244void release_bsc_resources(struct bsc_data *bsc)
245{
Holger Hans Peter Freyther594ee9a2010-11-16 11:03:19 +0100246}
247
248struct msgb *create_sccp_rlc(struct sccp_source_reference *src_ref,
249 struct sccp_source_reference *dst)
250{
Holger Hans Peter Freyther8220b942010-12-08 10:08:40 +0100251 LOGP(DMSC, LOGL_NOTICE, "Refusing to create connection handling.\n");
Holger Hans Peter Freyther594ee9a2010-11-16 11:03:19 +0100252 return NULL;
253}
254
255struct msgb *create_reset()
256{
Holger Hans Peter Freyther8220b942010-12-08 10:08:40 +0100257 LOGP(DMSC, LOGL_NOTICE, "Refusing to create a GSM0808 reset message.\n");
Holger Hans Peter Freyther594ee9a2010-11-16 11:03:19 +0100258 return NULL;
259}
260
Holger Hans Peter Freyther569f1e12011-01-02 18:47:49 +0100261void update_con_state(struct mtp_link_set *link, int rc, struct sccp_parse_result *res, struct msgb *msg, int from_msc, int sls)
Holger Hans Peter Freyther594ee9a2010-11-16 11:03:19 +0100262{
263 LOGP(DMSC, LOGL_ERROR, "Should not be called.\n");
264 return;
265}
266
267unsigned int sls_for_src_ref(struct sccp_source_reference *ref)
268{
269 return 13;
270}
271
272int bsc_ussd_handle_in_msg(struct bsc_data *bsc, struct sccp_parse_result *res, struct msgb *msg)
273{
274 return 0;
275}
276
277int bsc_ussd_handle_out_msg(struct bsc_data *bsc, struct sccp_parse_result *res, struct msgb *msg)
278{
279 return 0;
280}