blob: 48ce137e3366f802d293f04bf0f8d7a3eccbcabf [file] [log] [blame]
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +08001/* Everything related to the BSC connection */
2/*
3 * (C) 2010 by Holger Hans Peter Freyther <zecke@selfish.org>
4 * (C) 2010 by On-Waves
5 * 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 Freythercbf7d182010-07-31 05:25:35 +080025#include <osmocore/linuxlist.h>
26#include <osmocore/select.h>
27#include <osmocore/timer.h>
28#include <osmocore/write_queue.h>
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +080029
Holger Hans Peter Freyther0e4e35f2010-09-30 03:04:28 +080030#include <osmocore/protocol/gsm_04_08.h>
31
Holger Hans Peter Freythercf381e22010-08-04 18:39:26 +080032#include <osmocom/sccp/sccp.h>
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +080033
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +080034
35#include <netinet/in.h>
36#include <arpa/inet.h>
37
38struct bsc_data;
39struct snmp_mtp_session;
40
41/**
42 * A link to the underlying MTP2 library or such
43 */
44struct link_data {
45 union {
46 struct {
47 struct thread_notifier *notifier;
48 struct llist_head mtp_queue;
49 struct timer_list mtp_timeout;
50 } c7;
51 struct {
52 struct write_queue write_queue;
53 struct sockaddr_in remote;
54 struct snmp_mtp_session *session;
Holger Hans Peter Freytherb6edf972011-01-02 16:41:11 +010055 int link_index;
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +080056 int reset_timeout;
57 } udp;
58 };
59
60 int pcap_fd;
61 struct bsc_data *bsc;
Holger Hans Peter Freyther569f1e12011-01-02 18:47:49 +010062 struct mtp_link_set *the_link;
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +080063
64 struct timer_list link_activate;
65 int forced_down;
66
67 int (*start)(struct link_data *);
68 int (*write)(struct link_data *, struct msgb *msg);
69 int (*shutdown)(struct link_data *);
70 int (*reset)(struct link_data *data);
71 int (*clear_queue)(struct link_data *data);
72};
73
74
75struct bsc_data {
76 /* MSC */
77 char *msc_address;
78 struct write_queue msc_connection;
79 struct timer_list reconnect_timer;
80 int first_contact;
81 int msc_time;
82 struct timer_list msc_timeout;
83 int msc_ip_dscp;
84
85 int ping_time;
86 int pong_time;
87 struct timer_list ping_timeout;
88 struct timer_list pong_timeout;
89
Holger Hans Peter Freyther0c95c6a2010-08-07 02:37:43 +080090 int msc_link_down;
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +080091 struct llist_head sccp_connections;
92 struct timer_list reset_timeout;
93 int reset_count;
94
95 struct timer_list start_timer;
96
97 int setup;
98
99 struct link_data link;
100
101 const char *token;
102
103 /* mgcp messgaes */
104 struct write_queue mgcp_agent;
Holger Hans Peter Freyther7942abc2010-09-30 00:34:46 +0800105
106 int dpc;
107 int opc;
Holger Hans Peter Freyther7a725562011-01-01 13:34:58 +0100108 int sccp_opc;
Holger Hans Peter Freyther7942abc2010-09-30 00:34:46 +0800109 int src_port;
110 int udp_port;
111 char *udp_ip;
112 int once;
Holger Hans Peter Freyther0e4e35f2010-09-30 03:04:28 +0800113
Holger Hans Peter Freytherb38b33b2010-11-26 21:21:04 +0100114 /* the network header to use */
115 int ni_ni;
116 int ni_spare;
117
Holger Hans Peter Freyther0e4e35f2010-09-30 03:04:28 +0800118 /* LAC of the cell */
119 struct gsm48_loc_area_id lai;
120 uint16_t mcc;
121 uint16_t mnc;
122 uint16_t lac;
Holger Hans Peter Freyther76943812010-11-16 11:14:34 +0100123
124 int forward_only;
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +0800125};
126
127/* bsc related functions */
128void release_bsc_resources(struct bsc_data *bsc);
129void bsc_link_down(struct link_data *data);
130void bsc_link_up(struct link_data *data);
131
132/* msc related functions */
Holger Hans Peter Freyther594ee9a2010-11-16 11:03:19 +0100133int msc_init(struct bsc_data *bsc, int mgcp);
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +0800134void msc_send_rlc(struct bsc_data *bsc, struct sccp_source_reference *src, struct sccp_source_reference *dest);
135void msc_send_reset(struct bsc_data *bsc);
136void 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 +0100137void msc_send_direct(struct bsc_data *bsc, struct msgb *msg);
Holger Hans Peter Freyther43d9eec2010-08-07 01:54:19 +0800138void msc_close_connection(struct bsc_data *data);
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +0800139
140/* connection tracking and action */
Holger Hans Peter Freyther569f1e12011-01-02 18:47:49 +0100141void 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 +0800142unsigned int sls_for_src_ref(struct sccp_source_reference *ref);
143
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +0800144/* udp init */
145int link_udp_init(struct link_data *data, int src_port, const char *dest_ip, int port);
Holger Hans Peter Freythera99b04b2011-01-02 11:23:54 +0100146int link_init(struct bsc_data *bsc);
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +0800147
148/* MGCP */
Holger Hans Peter Freyther5aa17012010-07-31 04:37:26 +0800149void mgcp_forward(struct bsc_data *bsc, const uint8_t *data, unsigned int length);
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +0800150
151#endif