blob: 436ae1bc4741e943632df4b9c762edba4373e995 [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 Freyther1b6901e2011-01-17 16:13:28 +010073void mtp_link_set_forward_isup(struct mtp_link_set *set, struct msgb *msg, int sls)
74{
75 LOGP(DINP, LOGL_ERROR, "ISUP is not handled.\n");
76}
77
Holger Hans Peter Freytherc8405692011-01-02 20:24:08 +010078void mtp_linkset_down(struct mtp_link_set *set)
Holger Hans Peter Freyther594ee9a2010-11-16 11:03:19 +010079{
Holger Hans Peter Freytherc8405692011-01-02 20:24:08 +010080 set->available = 0;
81 mtp_link_set_stop(set);
Holger Hans Peter Freyther594ee9a2010-11-16 11:03:19 +010082
Holger Hans Peter Freyther594ee9a2010-11-16 11:03:19 +010083 /* If we have an A link send a reset to the MSC */
Holger Hans Peter Freytherc8405692011-01-02 20:24:08 +010084 msc_send_reset(set->bsc);
Holger Hans Peter Freyther594ee9a2010-11-16 11:03:19 +010085}
86
Holger Hans Peter Freytherc8405692011-01-02 20:24:08 +010087void mtp_linkset_up(struct mtp_link_set *set)
Holger Hans Peter Freyther594ee9a2010-11-16 11:03:19 +010088{
Holger Hans Peter Freytherc8405692011-01-02 20:24:08 +010089 set->available = 1;
90 mtp_link_set_reset(set);
Holger Hans Peter Freyther594ee9a2010-11-16 11:03:19 +010091}
92
93static void print_usage()
94{
95 printf("Usage: cellmgr_ng\n");
96}
97
98static void sigint()
99{
100 static pthread_mutex_t exit_mutex = PTHREAD_MUTEX_INITIALIZER;
101 static int handled = 0;
102
103 /* failed to lock */
104 if (pthread_mutex_trylock(&exit_mutex) != 0)
105 return;
106 if (handled)
107 goto out;
108
109 printf("Terminating.\n");
110 handled = 1;
111 if (bsc.setup)
Holger Hans Peter Freytherfe72c162011-01-04 13:21:52 +0100112 link_shutdown_all(bsc.link_set);
Holger Hans Peter Freyther594ee9a2010-11-16 11:03:19 +0100113 exit(0);
114
115out:
116 pthread_mutex_unlock(&exit_mutex);
117}
118
119static void sigusr2()
120{
121 printf("Closing the MSC connection on demand.\n");
122 msc_close_connection(&bsc);
123}
124
125static void print_help()
126{
127 printf(" Some useful help...\n");
128 printf(" -h --help this text\n");
129 printf(" -c --config=CFG The config file to use.\n");
130 printf(" -p --pcap=FILE. Write MSUs to the PCAP file.\n");
131 printf(" -c --once. Send the SLTM msg only once.\n");
132 printf(" -v --version. Print the version number\n");
133}
134
135static void handle_options(int argc, char **argv)
136{
137 while (1) {
138 int option_index = 0, c;
139 static struct option long_options[] = {
140 {"help", 0, 0, 'h'},
141 {"config", 1, 0, 'c'},
142 {"pcap", 1, 0, 'p'},
143 {"version", 0, 0, 0},
144 {0, 0, 0, 0},
145 };
146
147 c = getopt_long(argc, argv, "hc:p:v",
148 long_options, &option_index);
149 if (c == -1)
150 break;
151
152 switch (c) {
153 case 'h':
154 print_usage();
155 print_help();
156 exit(0);
157 case 'p':
Holger Hans Peter Freyther644aafb2011-01-03 23:51:07 +0100158 if (bsc.pcap_fd >= 0)
159 close(bsc.pcap_fd);
160 bsc.pcap_fd = open(optarg, O_WRONLY | O_TRUNC | O_CREAT, S_IRUSR | S_IWUSR | S_IRGRP| S_IROTH);
161 if (bsc.pcap_fd < 0) {
Holger Hans Peter Freyther594ee9a2010-11-16 11:03:19 +0100162 fprintf(stderr, "Failed to open PCAP file.\n");
163 exit(0);
164 }
Holger Hans Peter Freyther644aafb2011-01-03 23:51:07 +0100165 mtp_pcap_write_header(bsc.pcap_fd);
Holger Hans Peter Freyther594ee9a2010-11-16 11:03:19 +0100166 break;
167 case 'c':
168 config = optarg;
169 break;
170 case 'v':
171 printf("This is %s version %s.\n", PACKAGE, VERSION);
172 exit(0);
173 break;
174 default:
175 fprintf(stderr, "Unknown option.\n");
176 break;
177 }
178 }
179}
180
Holger Hans Peter Freyther594ee9a2010-11-16 11:03:19 +0100181int main(int argc, char **argv)
182{
183 int rc;
184 INIT_LLIST_HEAD(&bsc.sccp_connections);
185
Holger Hans Peter Freythera310e532011-01-22 16:34:16 +0100186 bsc.app = APP_RELAY;
Holger Hans Peter Freyther594ee9a2010-11-16 11:03:19 +0100187 bsc.dpc = 1;
188 bsc.opc = 0;
Holger Hans Peter Freyther7a725562011-01-01 13:34:58 +0100189 bsc.sccp_opc = -1;
Holger Hans Peter Freytherd8a73e22011-01-17 22:37:11 +0100190 bsc.isup_opc = -1;
Holger Hans Peter Freyther594ee9a2010-11-16 11:03:19 +0100191 bsc.udp_port = 3456;
192 bsc.udp_ip = NULL;
193 bsc.src_port = 1313;
Holger Hans Peter Freyther396282e2010-12-08 10:08:14 +0100194 bsc.ni_ni = MTP_NI_NATION_NET;
195 bsc.ni_spare = 0;
Holger Hans Peter Freyther594ee9a2010-11-16 11:03:19 +0100196
Holger Hans Peter Freyther569f1e12011-01-02 18:47:49 +0100197 mtp_link_set_init();
Holger Hans Peter Freyther594ee9a2010-11-16 11:03:19 +0100198 thread_init();
199
200 log_init(&log_info);
201 stderr_target = log_target_create_stderr();
202 log_add_target(stderr_target);
203
204 /* enable filters */
205 log_set_all_filter(stderr_target, 1);
206 log_set_category_filter(stderr_target, DINP, 1, LOGL_INFO);
207 log_set_category_filter(stderr_target, DSCCP, 1, LOGL_INFO);
208 log_set_category_filter(stderr_target, DMSC, 1, LOGL_INFO);
209 log_set_category_filter(stderr_target, DMGCP, 1, LOGL_INFO);
210 log_set_print_timestamp(stderr_target, 1);
211 log_set_use_color(stderr_target, 0);
212
213 sccp_set_log_area(DSCCP);
214
215 bsc.setup = 0;
216 bsc.msc_address = "127.0.0.1";
Holger Hans Peter Freyther644aafb2011-01-03 23:51:07 +0100217 bsc.pcap_fd = -1;
218 bsc.udp_reset_timeout = 180;
Holger Hans Peter Freyther594ee9a2010-11-16 11:03:19 +0100219 bsc.ping_time = 20;
220 bsc.pong_time = 5;
221 bsc.msc_time = 20;
Holger Hans Peter Freyther76943812010-11-16 11:14:34 +0100222 bsc.forward_only = 1;
Holger Hans Peter Freyther594ee9a2010-11-16 11:03:19 +0100223
224 handle_options(argc, argv);
225
226 signal(SIGPIPE, SIG_IGN);
227 signal(SIGINT, sigint);
228 signal(SIGUSR2, sigusr2);
229 srand(time(NULL));
230
231 cell_vty_init();
232 if (vty_read_config_file(config, NULL) < 0) {
233 fprintf(stderr, "Failed to read the VTY config.\n");
234 return -1;
235 }
236
237 rc = telnet_init(NULL, NULL, 4242);
238 if (rc < 0)
239 return rc;
240
Holger Hans Peter Freythera99b04b2011-01-02 11:23:54 +0100241 if (link_init(&bsc) != 0)
242 return -1;
Holger Hans Peter Freyther594ee9a2010-11-16 11:03:19 +0100243
244 while (1) {
245 bsc_select_main(0);
246 }
247
248 return 0;
249}
250
251void release_bsc_resources(struct bsc_data *bsc)
252{
Holger Hans Peter Freyther594ee9a2010-11-16 11:03:19 +0100253}
254
255struct msgb *create_sccp_rlc(struct sccp_source_reference *src_ref,
256 struct sccp_source_reference *dst)
257{
Holger Hans Peter Freyther8220b942010-12-08 10:08:40 +0100258 LOGP(DMSC, LOGL_NOTICE, "Refusing to create connection handling.\n");
Holger Hans Peter Freyther594ee9a2010-11-16 11:03:19 +0100259 return NULL;
260}
261
262struct msgb *create_reset()
263{
Holger Hans Peter Freyther8220b942010-12-08 10:08:40 +0100264 LOGP(DMSC, LOGL_NOTICE, "Refusing to create a GSM0808 reset message.\n");
Holger Hans Peter Freyther594ee9a2010-11-16 11:03:19 +0100265 return NULL;
266}
267
Holger Hans Peter Freyther569f1e12011-01-02 18:47:49 +0100268void 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 +0100269{
270 LOGP(DMSC, LOGL_ERROR, "Should not be called.\n");
271 return;
272}
273
274unsigned int sls_for_src_ref(struct sccp_source_reference *ref)
275{
276 return 13;
277}
278
279int bsc_ussd_handle_in_msg(struct bsc_data *bsc, struct sccp_parse_result *res, struct msgb *msg)
280{
281 return 0;
282}
283
284int bsc_ussd_handle_out_msg(struct bsc_data *bsc, struct sccp_parse_result *res, struct msgb *msg)
285{
286 return 0;
287}