blob: fe6d295ee5488e2bdfca3b0daa58399d9d18e048 [file] [log] [blame]
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +08001/* Everything related to the BSC connection */
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#ifndef BSC_DATA_H
23#define BSC_DATA_H
24
Holger Hans Peter Freyther0e2f9112011-01-17 11:54:39 +010025#include "mtp_data.h"
26
Holger Hans Peter Freythercbf7d182010-07-31 05:25:35 +080027#include <osmocore/linuxlist.h>
28#include <osmocore/select.h>
29#include <osmocore/timer.h>
30#include <osmocore/write_queue.h>
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +080031
Holger Hans Peter Freyther0e4e35f2010-09-30 03:04:28 +080032#include <osmocore/protocol/gsm_04_08.h>
33
Holger Hans Peter Freythercf381e22010-08-04 18:39:26 +080034#include <osmocom/sccp/sccp.h>
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +080035
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +080036
37#include <netinet/in.h>
38#include <arpa/inet.h>
39
40struct bsc_data;
41struct snmp_mtp_session;
42
Holger Hans Peter Freytherf38114e2011-01-20 21:11:13 +010043struct mtp_udp_data {
44 struct write_queue write_queue;
Holger Hans Peter Freyther083a30b2011-01-21 12:57:12 +010045 struct timer_list snmp_poll;
Holger Hans Peter Freytherf38114e2011-01-20 21:11:13 +010046
47 struct llist_head links;
48};
49
Holger Hans Peter Freyther0e2f9112011-01-17 11:54:39 +010050struct mtp_udp_link {
51 /* subclass */
52 struct mtp_link base;
Holger Hans Peter Freytherfe72c162011-01-04 13:21:52 +010053
Holger Hans Peter Freyther0e2f9112011-01-17 11:54:39 +010054 /* UDP specific stuff */
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +080055 struct bsc_data *bsc;
Holger Hans Peter Freyther0e2f9112011-01-17 11:54:39 +010056 int link_index;
57 int reset_timeout;
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +080058
Holger Hans Peter Freytherf38114e2011-01-20 21:11:13 +010059 struct sockaddr_in remote;
60
61 struct mtp_udp_data *data;
62 struct llist_head entry;
Holger Hans Peter Freyther3a1c0af2011-01-24 20:21:11 +010063
64 /* snmp for controlling the link */
65 struct snmp_mtp_session *session;
Holger Hans Peter Freytherf38114e2011-01-20 21:11:13 +010066};
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +080067
Holger Hans Peter Freythera310e532011-01-22 16:34:16 +010068enum {
69 APP_CELLMGR,
70 APP_RELAY,
71 APP_STP,
72};
73
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +080074struct bsc_data {
Holger Hans Peter Freythera310e532011-01-22 16:34:16 +010075 int app;
76
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +080077 /* MSC */
78 char *msc_address;
79 struct write_queue msc_connection;
80 struct timer_list reconnect_timer;
81 int first_contact;
82 int msc_time;
83 struct timer_list msc_timeout;
84 int msc_ip_dscp;
85
86 int ping_time;
87 int pong_time;
88 struct timer_list ping_timeout;
89 struct timer_list pong_timeout;
90
Holger Hans Peter Freyther0c95c6a2010-08-07 02:37:43 +080091 int msc_link_down;
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +080092 struct llist_head sccp_connections;
93 struct timer_list reset_timeout;
94 int reset_count;
95
96 struct timer_list start_timer;
97
98 int setup;
99
Holger Hans Peter Freyther644aafb2011-01-03 23:51:07 +0100100 int pcap_fd;
101 int udp_reset_timeout;
102 struct mtp_link_set *link_set;
Holger Hans Peter Freyther9cf11bc2011-01-17 15:53:06 +0100103 struct mtp_link_set *m2ua_set;
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +0800104
105 const char *token;
106
107 /* mgcp messgaes */
108 struct write_queue mgcp_agent;
Holger Hans Peter Freyther7942abc2010-09-30 00:34:46 +0800109
Holger Hans Peter Freytherf38114e2011-01-20 21:11:13 +0100110 /* udp code */
111 struct mtp_udp_data udp_data;
112
Holger Hans Peter Freyther7942abc2010-09-30 00:34:46 +0800113 int dpc;
114 int opc;
Holger Hans Peter Freyther7a725562011-01-01 13:34:58 +0100115 int sccp_opc;
Holger Hans Peter Freytherd8a73e22011-01-17 22:37:11 +0100116 int isup_opc;
Holger Hans Peter Freyther7942abc2010-09-30 00:34:46 +0800117 int src_port;
118 int udp_port;
119 char *udp_ip;
Holger Hans Peter Freytherc6bfa272011-01-22 17:06:34 +0100120 int udp_nr_links;
Holger Hans Peter Freyther7942abc2010-09-30 00:34:46 +0800121 int once;
Holger Hans Peter Freyther0e4e35f2010-09-30 03:04:28 +0800122
Holger Hans Peter Freytherb38b33b2010-11-26 21:21:04 +0100123 /* the network header to use */
124 int ni_ni;
125 int ni_spare;
126
Holger Hans Peter Freytherf603f282011-01-30 00:24:15 +0100127 /* isup handling */
128 int isup_pass;
129
Holger Hans Peter Freyther0e4e35f2010-09-30 03:04:28 +0800130 /* LAC of the cell */
131 struct gsm48_loc_area_id lai;
132 uint16_t mcc;
133 uint16_t mnc;
134 uint16_t lac;
Holger Hans Peter Freyther76943812010-11-16 11:14:34 +0100135
136 int forward_only;
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +0800137};
138
139/* bsc related functions */
140void release_bsc_resources(struct bsc_data *bsc);
Holger Hans Peter Freytherc8405692011-01-02 20:24:08 +0100141
142void mtp_linkset_down(struct mtp_link_set *);
143void mtp_linkset_up(struct mtp_link_set *);
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +0800144
145/* msc related functions */
Holger Hans Peter Freyther594ee9a2010-11-16 11:03:19 +0100146int msc_init(struct bsc_data *bsc, int mgcp);
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +0800147void msc_send_rlc(struct bsc_data *bsc, struct sccp_source_reference *src, struct sccp_source_reference *dest);
148void msc_send_reset(struct bsc_data *bsc);
149void msc_send_msg(struct bsc_data *bsc, int rc, struct sccp_parse_result *, struct msgb *msg);
Holger Hans Peter Freyther594ee9a2010-11-16 11:03:19 +0100150void msc_send_direct(struct bsc_data *bsc, struct msgb *msg);
Holger Hans Peter Freyther43d9eec2010-08-07 01:54:19 +0800151void msc_close_connection(struct bsc_data *data);
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +0800152
153/* connection tracking and action */
Holger Hans Peter Freyther569f1e12011-01-02 18:47:49 +0100154void update_con_state(struct mtp_link_set *link, int rc, struct sccp_parse_result *result, struct msgb *msg, int from_msc, int sls);
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +0800155unsigned int sls_for_src_ref(struct sccp_source_reference *ref);
156
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +0800157/* udp init */
Holger Hans Peter Freyther3a1c0af2011-01-24 20:21:11 +0100158int link_global_init(struct mtp_udp_data *data, int src_port);
159int link_udp_init(struct mtp_udp_link *data, char *dest_ip, int port);
Holger Hans Peter Freythera99b04b2011-01-02 11:23:54 +0100160int link_init(struct bsc_data *bsc);
Holger Hans Peter Freytherfe72c162011-01-04 13:21:52 +0100161int link_shutdown_all(struct mtp_link_set *);
162int link_reset_all(struct mtp_link_set *);
163int link_clear_all(struct mtp_link_set *);
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +0800164
165/* MGCP */
Holger Hans Peter Freyther5aa17012010-07-31 04:37:26 +0800166void mgcp_forward(struct bsc_data *bsc, const uint8_t *data, unsigned int length);
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +0800167
Holger Hans Peter Freytherddf8eae2011-01-22 17:36:01 +0100168/* pcap */
Holger Hans Peter Freyther36260e92011-01-22 17:37:56 +0100169enum {
170 NET_IN,
171 NET_OUT,
172};
173int mtp_handle_pcap(struct mtp_link *, int dir, const uint8_t *data, int length);
Holger Hans Peter Freytherddf8eae2011-01-22 17:36:01 +0100174
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +0800175#endif