blob: 7f2f045356a87e0063a0cb04741dde03978022a8 [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
Holger Hans Peter Freyther02921272011-01-22 23:05:03 +010030#include <osmocom/m2ua/m2ua_msg.h>
31
Holger Hans Peter Freyther594ee9a2010-11-16 11:03:19 +010032#include <osmocore/talloc.h>
33
34#include <osmocom/vty/vty.h>
35#include <osmocom/vty/telnet_interface.h>
36
37#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
48#ifndef _GNU_SOURCE
49#define _GNU_SOURCE
50#endif
51#include <getopt.h>
52
53#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
60static struct log_target *stderr_target;
61
62static char *config = "udt_relay.cfg";
63
64struct bsc_data bsc;
65extern void cell_vty_init(void);
66
Holger Hans Peter Freyther594ee9a2010-11-16 11:03:19 +010067/*
68 * methods called from the MTP Level3 part
69 */
Holger Hans Peter Freyther569f1e12011-01-02 18:47:49 +010070void mtp_link_set_forward_sccp(struct mtp_link_set *link, struct msgb *_msg, int sls)
Holger Hans Peter Freyther594ee9a2010-11-16 11:03:19 +010071{
72 msc_send_direct(&bsc, _msg);
73}
74
Holger Hans Peter Freyther1b6901e2011-01-17 16:13:28 +010075void mtp_link_set_forward_isup(struct mtp_link_set *set, struct msgb *msg, int sls)
76{
77 LOGP(DINP, LOGL_ERROR, "ISUP is not handled.\n");
78}
79
Holger Hans Peter Freytherc8405692011-01-02 20:24:08 +010080void mtp_linkset_down(struct mtp_link_set *set)
Holger Hans Peter Freyther594ee9a2010-11-16 11:03:19 +010081{
Holger Hans Peter Freytherc8405692011-01-02 20:24:08 +010082 set->available = 0;
83 mtp_link_set_stop(set);
Holger Hans Peter Freyther594ee9a2010-11-16 11:03:19 +010084
Holger Hans Peter Freyther594ee9a2010-11-16 11:03:19 +010085 /* If we have an A link send a reset to the MSC */
Holger Hans Peter Freytherc8405692011-01-02 20:24:08 +010086 msc_send_reset(set->bsc);
Holger Hans Peter Freyther594ee9a2010-11-16 11:03:19 +010087}
88
Holger Hans Peter Freytherc8405692011-01-02 20:24:08 +010089void mtp_linkset_up(struct mtp_link_set *set)
Holger Hans Peter Freyther594ee9a2010-11-16 11:03:19 +010090{
Holger Hans Peter Freytherc8405692011-01-02 20:24:08 +010091 set->available = 1;
92 mtp_link_set_reset(set);
Holger Hans Peter Freyther594ee9a2010-11-16 11:03:19 +010093}
94
95static void print_usage()
96{
97 printf("Usage: cellmgr_ng\n");
98}
99
100static void sigint()
101{
102 static pthread_mutex_t exit_mutex = PTHREAD_MUTEX_INITIALIZER;
103 static int handled = 0;
104
105 /* failed to lock */
106 if (pthread_mutex_trylock(&exit_mutex) != 0)
107 return;
108 if (handled)
109 goto out;
110
111 printf("Terminating.\n");
112 handled = 1;
113 if (bsc.setup)
Holger Hans Peter Freytherfe72c162011-01-04 13:21:52 +0100114 link_shutdown_all(bsc.link_set);
Holger Hans Peter Freyther594ee9a2010-11-16 11:03:19 +0100115 exit(0);
116
117out:
118 pthread_mutex_unlock(&exit_mutex);
119}
120
121static void sigusr2()
122{
123 printf("Closing the MSC connection on demand.\n");
124 msc_close_connection(&bsc);
125}
126
127static void print_help()
128{
129 printf(" Some useful help...\n");
130 printf(" -h --help this text\n");
131 printf(" -c --config=CFG The config file to use.\n");
132 printf(" -p --pcap=FILE. Write MSUs to the PCAP file.\n");
133 printf(" -c --once. Send the SLTM msg only once.\n");
134 printf(" -v --version. Print the version number\n");
135}
136
137static void handle_options(int argc, char **argv)
138{
139 while (1) {
140 int option_index = 0, c;
141 static struct option long_options[] = {
142 {"help", 0, 0, 'h'},
143 {"config", 1, 0, 'c'},
144 {"pcap", 1, 0, 'p'},
145 {"version", 0, 0, 0},
146 {0, 0, 0, 0},
147 };
148
149 c = getopt_long(argc, argv, "hc:p:v",
150 long_options, &option_index);
151 if (c == -1)
152 break;
153
154 switch (c) {
155 case 'h':
156 print_usage();
157 print_help();
158 exit(0);
159 case 'p':
Holger Hans Peter Freyther644aafb2011-01-03 23:51:07 +0100160 if (bsc.pcap_fd >= 0)
161 close(bsc.pcap_fd);
162 bsc.pcap_fd = open(optarg, O_WRONLY | O_TRUNC | O_CREAT, S_IRUSR | S_IWUSR | S_IRGRP| S_IROTH);
163 if (bsc.pcap_fd < 0) {
Holger Hans Peter Freyther594ee9a2010-11-16 11:03:19 +0100164 fprintf(stderr, "Failed to open PCAP file.\n");
165 exit(0);
166 }
Holger Hans Peter Freyther644aafb2011-01-03 23:51:07 +0100167 mtp_pcap_write_header(bsc.pcap_fd);
Holger Hans Peter Freyther594ee9a2010-11-16 11:03:19 +0100168 break;
169 case 'c':
170 config = optarg;
171 break;
172 case 'v':
173 printf("This is %s version %s.\n", PACKAGE, VERSION);
174 exit(0);
175 break;
176 default:
177 fprintf(stderr, "Unknown option.\n");
178 break;
179 }
180 }
181}
182
Holger Hans Peter Freyther594ee9a2010-11-16 11:03:19 +0100183int main(int argc, char **argv)
184{
185 int rc;
186 INIT_LLIST_HEAD(&bsc.sccp_connections);
187
Holger Hans Peter Freythera310e532011-01-22 16:34:16 +0100188 bsc.app = APP_RELAY;
Holger Hans Peter Freyther594ee9a2010-11-16 11:03:19 +0100189 bsc.dpc = 1;
190 bsc.opc = 0;
Holger Hans Peter Freyther7a725562011-01-01 13:34:58 +0100191 bsc.sccp_opc = -1;
Holger Hans Peter Freytherd8a73e22011-01-17 22:37:11 +0100192 bsc.isup_opc = -1;
Holger Hans Peter Freyther594ee9a2010-11-16 11:03:19 +0100193 bsc.udp_port = 3456;
194 bsc.udp_ip = NULL;
195 bsc.src_port = 1313;
Holger Hans Peter Freyther396282e2010-12-08 10:08:14 +0100196 bsc.ni_ni = MTP_NI_NATION_NET;
197 bsc.ni_spare = 0;
Holger Hans Peter Freytherc6bfa272011-01-22 17:06:34 +0100198 bsc.udp_nr_links = 1;
Holger Hans Peter Freyther594ee9a2010-11-16 11:03:19 +0100199
Holger Hans Peter Freyther569f1e12011-01-02 18:47:49 +0100200 mtp_link_set_init();
Holger Hans Peter Freyther594ee9a2010-11-16 11:03:19 +0100201 thread_init();
202
203 log_init(&log_info);
204 stderr_target = log_target_create_stderr();
205 log_add_target(stderr_target);
206
207 /* enable filters */
208 log_set_all_filter(stderr_target, 1);
209 log_set_category_filter(stderr_target, DINP, 1, LOGL_INFO);
210 log_set_category_filter(stderr_target, DSCCP, 1, LOGL_INFO);
211 log_set_category_filter(stderr_target, DMSC, 1, LOGL_INFO);
212 log_set_category_filter(stderr_target, DMGCP, 1, LOGL_INFO);
213 log_set_print_timestamp(stderr_target, 1);
214 log_set_use_color(stderr_target, 0);
215
216 sccp_set_log_area(DSCCP);
Holger Hans Peter Freyther02921272011-01-22 23:05:03 +0100217 m2ua_set_log_area(DM2UA);
Holger Hans Peter Freyther594ee9a2010-11-16 11:03:19 +0100218
219 bsc.setup = 0;
220 bsc.msc_address = "127.0.0.1";
Holger Hans Peter Freyther644aafb2011-01-03 23:51:07 +0100221 bsc.pcap_fd = -1;
222 bsc.udp_reset_timeout = 180;
Holger Hans Peter Freyther594ee9a2010-11-16 11:03:19 +0100223 bsc.ping_time = 20;
224 bsc.pong_time = 5;
225 bsc.msc_time = 20;
Holger Hans Peter Freyther76943812010-11-16 11:14:34 +0100226 bsc.forward_only = 1;
Holger Hans Peter Freyther594ee9a2010-11-16 11:03:19 +0100227
228 handle_options(argc, argv);
229
230 signal(SIGPIPE, SIG_IGN);
231 signal(SIGINT, sigint);
232 signal(SIGUSR2, sigusr2);
233 srand(time(NULL));
234
235 cell_vty_init();
236 if (vty_read_config_file(config, NULL) < 0) {
237 fprintf(stderr, "Failed to read the VTY config.\n");
238 return -1;
239 }
240
241 rc = telnet_init(NULL, NULL, 4242);
242 if (rc < 0)
243 return rc;
244
Holger Hans Peter Freythera99b04b2011-01-02 11:23:54 +0100245 if (link_init(&bsc) != 0)
246 return -1;
Holger Hans Peter Freyther594ee9a2010-11-16 11:03:19 +0100247
248 while (1) {
249 bsc_select_main(0);
250 }
251
252 return 0;
253}
254
255void release_bsc_resources(struct bsc_data *bsc)
256{
Holger Hans Peter Freyther594ee9a2010-11-16 11:03:19 +0100257}
258
259struct msgb *create_sccp_rlc(struct sccp_source_reference *src_ref,
260 struct sccp_source_reference *dst)
261{
Holger Hans Peter Freyther8220b942010-12-08 10:08:40 +0100262 LOGP(DMSC, LOGL_NOTICE, "Refusing to create connection handling.\n");
Holger Hans Peter Freyther594ee9a2010-11-16 11:03:19 +0100263 return NULL;
264}
265
266struct msgb *create_reset()
267{
Holger Hans Peter Freyther8220b942010-12-08 10:08:40 +0100268 LOGP(DMSC, LOGL_NOTICE, "Refusing to create a GSM0808 reset message.\n");
Holger Hans Peter Freyther594ee9a2010-11-16 11:03:19 +0100269 return NULL;
270}
271
Holger Hans Peter Freyther569f1e12011-01-02 18:47:49 +0100272void 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 +0100273{
274 LOGP(DMSC, LOGL_ERROR, "Should not be called.\n");
275 return;
276}
277
278unsigned int sls_for_src_ref(struct sccp_source_reference *ref)
279{
280 return 13;
281}
282
283int bsc_ussd_handle_in_msg(struct bsc_data *bsc, struct sccp_parse_result *res, struct msgb *msg)
284{
285 return 0;
286}
287
288int bsc_ussd_handle_out_msg(struct bsc_data *bsc, struct sccp_parse_result *res, struct msgb *msg)
289{
290 return 0;
291}