blob: 52b2ce5132597999462960c4076175ca8fd71654 [file] [log] [blame]
Holger Hans Peter Freyther6a97b8d2010-06-15 18:45:26 +08001/*
Holger Hans Peter Freythere18801052011-04-23 23:31:31 +02002 * (C) 2010-2011 by Holger Hans Peter Freyther <zecke@selfish.org>
3 * (C) 2010-2011 by On-Waves
Holger Hans Peter Freyther6a97b8d2010-06-15 18:45:26 +08004 * All Rights Reserved
5 *
6 * This program is free software; you can redistribute it and/or modify
Harald Welte9af6ddf2011-01-01 15:25:50 +01007 * it under the terms of the GNU Affero General Public License as published by
8 * the Free Software Foundation; either version 3 of the License, or
Holger Hans Peter Freyther6a97b8d2010-06-15 18:45:26 +08009 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
Harald Welte9af6ddf2011-01-01 15:25:50 +010014 * GNU Affero General Public License for more details.
Holger Hans Peter Freyther6a97b8d2010-06-15 18:45:26 +080015 *
Harald Welte9af6ddf2011-01-01 15:25:50 +010016 * You should have received a copy of the GNU Affero General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
Holger Hans Peter Freyther6a97b8d2010-06-15 18:45:26 +080018 *
19 */
20
21#ifndef BSC_NAT_H
22#define BSC_NAT_H
23
Holger Hans Peter Freytherf7d33352010-06-15 18:50:26 +080024#include "mgcp.h"
25
Holger Hans Peter Freyther9f8f3d02010-02-07 13:08:09 +010026
Pablo Neira Ayuso136f4532011-03-22 16:47:59 +010027#include <osmocom/core/select.h>
28#include <osmocom/core/msgb.h>
29#include <osmocom/core/msgfile.h>
30#include <osmocom/core/timer.h>
31#include <osmocom/core/write_queue.h>
32#include <osmocom/core/rate_ctr.h>
33#include <osmocom/core/statistics.h>
34#include <osmocom/gsm/protocol/gsm_04_08.h>
Holger Hans Peter Freyther6a97b8d2010-06-15 18:45:26 +080035
Holger Hans Peter Freytherc16cf272010-04-13 09:24:37 +020036#include <regex.h>
37
Holger Hans Peter Freyther1d6fb182010-01-30 11:53:30 +010038#define DIR_BSC 1
39#define DIR_MSC 2
Holger Hans Peter Freyther0b8f69d2010-06-15 18:45:38 +080040
Holger Hans Peter Freyther474698a2011-05-02 16:50:36 +020041#define PAGIN_GROUP_UNASSIGNED -1
42
Holger Hans Peter Freyther3d387422010-10-16 16:35:00 +020043struct sccp_source_reference;
Holger Hans Peter Freytherc2b31ed2010-07-31 05:17:17 +080044struct sccp_connections;
45struct bsc_nat_parsed;
Holger Hans Peter Freytheraa698242010-06-15 18:46:19 +080046struct bsc_nat;
Holger Hans Peter Freytherc16c2dc2010-10-13 20:22:36 +020047struct bsc_nat_ussd_con;
Holger Hans Peter Freytheraa698242010-06-15 18:46:19 +080048
Holger Hans Peter Freyther19c0a842010-05-16 02:00:40 +080049enum {
50 NAT_CON_TYPE_NONE,
51 NAT_CON_TYPE_LU,
52 NAT_CON_TYPE_CM_SERV_REQ,
53 NAT_CON_TYPE_PAG_RESP,
Holger Hans Peter Freyther74dc3032010-09-29 02:47:29 +080054 NAT_CON_TYPE_SSA,
Holger Hans Peter Freytherb71c23b2010-05-16 20:43:52 +080055 NAT_CON_TYPE_LOCAL_REJECT,
Holger Hans Peter Freyther19c0a842010-05-16 02:00:40 +080056 NAT_CON_TYPE_OTHER,
57};
58
Holger Hans Peter Freyther0b8f69d2010-06-15 18:45:38 +080059/*
Holger Hans Peter Freythere5d32492011-04-16 16:02:59 +020060 * Is this terminated to the MSC, to the local machine (release
61 * handling for IMSI filtering) or to a USSD provider?
62 */
63enum {
64 NAT_CON_END_MSC,
65 NAT_CON_END_LOCAL,
66 NAT_CON_END_USSD,
67};
68
69/*
Holger Hans Peter Freyther9f8f3d02010-02-07 13:08:09 +010070 * Per BSC data structure
71 */
72struct bsc_connection {
73 struct llist_head list_entry;
74
75 /* do we know anything about this BSC? */
76 int authenticated;
77
78 /* the fd we use to communicate */
Pablo Neira Ayusoe1273b12011-05-06 12:09:47 +020079 struct osmo_wqueue write_queue;
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +080080
Holger Hans Peter Freyther47dd4942010-04-06 15:11:34 +020081 /* the BSS associated */
82 struct bsc_config *cfg;
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +080083
84 /* a timeout node */
Pablo Neira Ayusobf540cb2011-05-06 12:11:06 +020085 struct osmo_timer_list id_timeout;
Holger Hans Peter Freytheraa698242010-06-15 18:46:19 +080086
Holger Hans Peter Freyther906c15e2010-05-02 19:28:59 +080087 /* pong timeout */
Pablo Neira Ayusobf540cb2011-05-06 12:11:06 +020088 struct osmo_timer_list ping_timeout;
89 struct osmo_timer_list pong_timeout;
Holger Hans Peter Freyther906c15e2010-05-02 19:28:59 +080090
Holger Hans Peter Freyther45fd07d2010-08-28 18:22:14 +080091 /* mgcp related code */
Holger Hans Peter Freythered500e32011-02-25 17:09:07 +010092 char *_endpoint_status;
Holger Hans Peter Freythera9e93312011-02-26 11:38:00 +010093 int number_multiplexes;
Holger Hans Peter Freyther9ec030d2011-02-27 11:04:27 +010094 int max_endpoints;
Holger Hans Peter Freyther45fd07d2010-08-28 18:22:14 +080095 int last_endpoint;
96
Holger Hans Peter Freytheraa698242010-06-15 18:46:19 +080097 /* a back pointer */
98 struct bsc_nat *nat;
Holger Hans Peter Freyther9f8f3d02010-02-07 13:08:09 +010099};
100
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800101/**
Holger Hans Peter Freytherd4702862010-04-12 12:17:09 +0200102 * Stats per BSC
103 */
104struct bsc_config_stats {
Holger Hans Peter Freytherb2c38eb2010-06-17 18:16:00 +0800105 struct rate_ctr_group *ctrg;
106};
Holger Hans Peter Freytherd4702862010-04-12 12:17:09 +0200107
Holger Hans Peter Freytherb2c38eb2010-06-17 18:16:00 +0800108enum bsc_cfg_ctr {
109 BCFG_CTR_SCCP_CONN,
110 BCFG_CTR_SCCP_CALLS,
111 BCFG_CTR_NET_RECONN,
Holger Hans Peter Freyther8330c1c2010-06-17 18:29:42 +0800112 BCFG_CTR_DROPPED_SCCP,
113 BCFG_CTR_DROPPED_CALLS,
Holger Hans Peter Freytheree884962010-09-25 17:58:22 +0800114 BCFG_CTR_REJECTED_CR,
115 BCFG_CTR_REJECTED_MSG,
116 BCFG_CTR_ILL_PACKET,
Holger Hans Peter Freyther463dc622010-10-03 19:41:42 +0800117 BCFG_CTR_CON_TYPE_LU,
118 BCFG_CTR_CON_CMSERV_RQ,
119 BCFG_CTR_CON_PAG_RESP,
Holger Hans Peter Freyther74dc3032010-09-29 02:47:29 +0800120 BCFG_CTR_CON_SSA,
Holger Hans Peter Freyther463dc622010-10-03 19:41:42 +0800121 BCFG_CTR_CON_OTHER,
Holger Hans Peter Freytherd4702862010-04-12 12:17:09 +0200122};
123
124/**
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800125 * One BSC entry in the config
126 */
127struct bsc_config {
128 struct llist_head entry;
129
130 char *token;
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800131 int nr;
132
Holger Hans Peter Freytherb6061012010-05-14 22:06:28 +0800133 char *description;
134
Holger Hans Peter Freytherc16cf272010-04-13 09:24:37 +0200135 /* imsi white and blacklist */
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +0800136 char *acc_lst_name;
Holger Hans Peter Freytherc16cf272010-04-13 09:24:37 +0200137
Holger Hans Peter Freyther62e58432010-04-21 19:05:14 +0800138 int forbid_paging;
Holger Hans Peter Freyther474698a2011-05-02 16:50:36 +0200139 int paging_group;
Holger Hans Peter Freyther62e58432010-04-21 19:05:14 +0800140
Holger Hans Peter Freythered500e32011-02-25 17:09:07 +0100141 /* audio handling */
Holger Hans Peter Freyther9ec030d2011-02-27 11:04:27 +0100142 int max_endpoints;
Holger Hans Peter Freythered500e32011-02-25 17:09:07 +0100143
Holger Hans Peter Freytherc16cf272010-04-13 09:24:37 +0200144 /* backpointer */
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800145 struct bsc_nat *nat;
Holger Hans Peter Freytherd4702862010-04-12 12:17:09 +0200146
147 struct bsc_config_stats stats;
Holger Hans Peter Freyther0bd60f32010-10-08 22:08:29 +0800148
149 struct llist_head lac_list;
150};
151
152struct bsc_lac_entry {
153 struct llist_head entry;
154 uint16_t lac;
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800155};
156
Holger Hans Peter Freyther474698a2011-05-02 16:50:36 +0200157struct bsc_nat_paging_group {
158 struct llist_head entry;
159
160 /* list of lac entries */
161 struct llist_head lists;
162 int nr;
163};
164
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800165/**
Holger Hans Peter Freythera0df82d2010-04-01 08:21:33 +0200166 * BSCs point of view of endpoints
167 */
168struct bsc_endpoint {
Holger Hans Peter Freyther5b2726e2010-08-06 09:05:05 +0800169 /* the operation that is carried out */
170 int transaction_state;
Holger Hans Peter Freythera0df82d2010-04-01 08:21:33 +0200171 /* the pending transaction id */
172 char *transaction_id;
173 /* the bsc we are talking to */
174 struct bsc_connection *bsc;
175};
176
177/**
Holger Hans Peter Freytherd4702862010-04-12 12:17:09 +0200178 * Statistic for the nat.
179 */
180struct bsc_nat_statistics {
181 struct {
182 struct counter *conn;
183 struct counter *calls;
184 } sccp;
185
186 struct {
187 struct counter *reconn;
188 struct counter *auth_fail;
189 } bsc;
190
191 struct {
192 struct counter *reconn;
193 } msc;
Holger Hans Peter Freytherc16c2dc2010-10-13 20:22:36 +0200194
195 struct {
196 struct counter *reconn;
197 } ussd;
Holger Hans Peter Freytherd4702862010-04-12 12:17:09 +0200198};
199
Holger Hans Peter Freyther2f1a9842010-09-25 06:14:52 +0800200enum bsc_nat_acc_ctr {
201 ACC_LIST_BSC_FILTER,
202 ACC_LIST_NAT_FILTER,
203};
204
Holger Hans Peter Freyther29c67032010-06-08 10:14:44 +0800205struct bsc_nat_acc_lst {
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +0800206 struct llist_head list;
207
Holger Hans Peter Freyther2f1a9842010-09-25 06:14:52 +0800208 /* counter */
209 struct rate_ctr_group *stats;
210
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +0800211 /* the name of the list */
212 const char *name;
Holger Hans Peter Freytherd77c8172010-06-08 10:53:39 +0800213 struct llist_head fltr_list;
214};
215
216struct bsc_nat_acc_lst_entry {
217 struct llist_head list;
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +0800218
219 /* the filter */
220 char *imsi_allow;
221 regex_t imsi_allow_re;
222 char *imsi_deny;
223 regex_t imsi_deny_re;
224};
225
Holger Hans Peter Freytherd4702862010-04-12 12:17:09 +0200226/**
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800227 * the structure of the "nat" network
228 */
229struct bsc_nat {
230 /* active SCCP connections that need patching */
231 struct llist_head sccp_connections;
232
233 /* active BSC connections that need patching */
234 struct llist_head bsc_connections;
235
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +0800236 /* access lists */
237 struct llist_head access_lists;
238
Holger Hans Peter Freyther474698a2011-05-02 16:50:36 +0200239 /* paging groups */
240 struct llist_head paging_groups;
241
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800242 /* known BSC's */
243 struct llist_head bsc_configs;
244 int num_bsc;
Holger Hans Peter Freyther6b771072010-07-27 19:21:53 +0800245 int bsc_ip_dscp;
Holger Hans Peter Freytherf7d33352010-06-15 18:50:26 +0800246
247 /* MGCP config */
248 struct mgcp_config *mgcp_cfg;
Holger Hans Peter Freytherdbd16fe2010-07-23 19:08:55 +0800249 uint8_t mgcp_msg[4096];
Holger Hans Peter Freyther8d200652010-04-04 18:09:10 +0200250 int mgcp_length;
Holger Hans Peter Freythera0df82d2010-04-01 08:21:33 +0200251
Holger Hans Peter Freytherb7527612010-04-07 11:20:36 +0200252 /* msc things */
Holger Hans Peter Freythere18801052011-04-23 23:31:31 +0200253 struct llist_head dests;
254 struct bsc_msc_dest *main_dest;
Holger Hans Peter Freytheraad82ce2010-05-11 19:07:39 +0800255 struct bsc_msc_connection *msc_con;
Holger Hans Peter Freythere635dab2010-05-15 00:14:58 +0800256 char *token;
Holger Hans Peter Freytherb7527612010-04-07 11:20:36 +0200257
Holger Hans Peter Freytherda35a8d2010-05-05 16:57:38 +0800258 /* timeouts */
259 int auth_timeout;
260 int ping_timeout;
261 int pong_timeout;
262
Holger Hans Peter Freythera0df82d2010-04-01 08:21:33 +0200263 struct bsc_endpoint *bsc_endpoints;
Holger Hans Peter Freytherd4702862010-04-12 12:17:09 +0200264
Holger Hans Peter Freytherc16cf272010-04-13 09:24:37 +0200265 /* filter */
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +0800266 char *acc_lst_name;
Holger Hans Peter Freytherc16cf272010-04-13 09:24:37 +0200267
Holger Hans Peter Freyther76424392010-10-21 10:59:54 +0200268 /* number rewriting */
269 char *num_rewr_name;
270 struct msg_entries *num_rewr;
271
Holger Hans Peter Freytherd1effd82010-10-10 17:29:20 +0200272 /* USSD messages we want to match */
273 char *ussd_lst_name;
Holger Hans Peter Freytherc1578bc2010-10-11 10:06:39 +0200274 char *ussd_query;
Holger Hans Peter Freythera18b1162011-04-01 17:32:21 +0200275 regex_t ussd_query_re;
Holger Hans Peter Freythere393f272010-10-12 18:25:52 +0200276 char *ussd_token;
277 char *ussd_local;
Pablo Neira Ayuso4db92992011-05-06 12:11:23 +0200278 struct osmo_fd ussd_listen;
Holger Hans Peter Freytherc16c2dc2010-10-13 20:22:36 +0200279 struct bsc_nat_ussd_con *ussd_con;
Holger Hans Peter Freytherd1effd82010-10-10 17:29:20 +0200280
Holger Hans Peter Freytherde2b8602011-04-23 23:55:14 +0200281 /* for maintainenance */
282 int blocked;
283
Holger Hans Peter Freytherd4702862010-04-12 12:17:09 +0200284 /* statistics */
285 struct bsc_nat_statistics stats;
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800286};
287
Holger Hans Peter Freyther91b9a452011-04-16 17:01:47 +0200288struct bsc_nat_ussd_con {
Pablo Neira Ayusoe1273b12011-05-06 12:09:47 +0200289 struct osmo_wqueue queue;
Holger Hans Peter Freyther91b9a452011-04-16 17:01:47 +0200290 struct bsc_nat *nat;
291 int authorized;
292
Pablo Neira Ayusobf540cb2011-05-06 12:11:06 +0200293 struct osmo_timer_list auth_timeout;
Holger Hans Peter Freyther91b9a452011-04-16 17:01:47 +0200294};
295
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800296/* create and init the structures */
Holger Hans Peter Freyther0bd60f32010-10-08 22:08:29 +0800297struct bsc_config *bsc_config_alloc(struct bsc_nat *nat, const char *token);
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800298struct bsc_config *bsc_config_num(struct bsc_nat *nat, int num);
Holger Hans Peter Freyther9212d9d2011-02-27 11:18:41 +0100299void bsc_config_free(struct bsc_config *);
Holger Hans Peter Freyther0bd60f32010-10-08 22:08:29 +0800300void bsc_config_add_lac(struct bsc_config *cfg, int lac);
301void bsc_config_del_lac(struct bsc_config *cfg, int lac);
302int bsc_config_handles_lac(struct bsc_config *cfg, int lac);
303
Holger Hans Peter Freytherdcf8a7d2010-06-15 18:48:01 +0800304struct bsc_nat *bsc_nat_alloc(void);
305struct bsc_connection *bsc_connection_alloc(struct bsc_nat *nat);
Holger Hans Peter Freythera88742c2010-06-15 18:51:04 +0800306void bsc_nat_set_msc_ip(struct bsc_nat *bsc, const char *ip);
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800307
Holger Hans Peter Freyther23fe7be2010-03-30 10:45:48 +0200308void sccp_connection_destroy(struct sccp_connections *);
Holger Hans Peter Freyther2f9dcf02010-04-27 13:21:39 +0800309void bsc_close_connection(struct bsc_connection *);
Holger Hans Peter Freyther9f8f3d02010-02-07 13:08:09 +0100310
Holger Hans Peter Freyther234d3122010-05-16 02:06:11 +0800311const char *bsc_con_type_to_string(int type);
312
Holger Hans Peter Freyther0b8f69d2010-06-15 18:45:38 +0800313/**
314 * parse the given message into the above structure
315 */
316struct bsc_nat_parsed *bsc_nat_parse(struct msgb *msg);
317
Holger Hans Peter Freyther6a97b8d2010-06-15 18:45:26 +0800318/**
319 * filter based on IP Access header in both directions
320 */
Holger Hans Peter Freyther1d6fb182010-01-30 11:53:30 +0100321int bsc_nat_filter_ipa(int direction, struct msgb *msg, struct bsc_nat_parsed *parsed);
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800322int bsc_nat_vty_init(struct bsc_nat *nat);
Holger Hans Peter Freyther1ffe98c2011-05-02 16:20:32 +0200323int bsc_nat_find_paging(struct msgb *msg, const uint8_t **,int *len);
Holger Hans Peter Freyther6a97b8d2010-06-15 18:45:26 +0800324
Holger Hans Peter Freyther0ab6bab2010-06-15 18:47:49 +0800325/**
Holger Hans Peter Freytherb4af5c92010-05-14 03:39:56 +0800326 * Content filtering.
327 */
Holger Hans Peter Freyther19c0a842010-05-16 02:00:40 +0800328int bsc_nat_filter_sccp_cr(struct bsc_connection *bsc, struct msgb *msg,
Holger Hans Peter Freyther749497e2010-09-29 01:19:42 +0800329 struct bsc_nat_parsed *, int *con_type, char **imsi);
Holger Hans Peter Freyther74e0a1b2010-09-15 01:11:08 +0800330int bsc_nat_filter_dt(struct bsc_connection *bsc, struct msgb *msg,
331 struct sccp_connections *con, struct bsc_nat_parsed *parsed);
Holger Hans Peter Freytherb4af5c92010-05-14 03:39:56 +0800332
333/**
Holger Hans Peter Freyther0ab6bab2010-06-15 18:47:49 +0800334 * SCCP patching and handling
335 */
Holger Hans Peter Freytherfa20c942010-05-16 16:51:31 +0800336struct sccp_connections *create_sccp_src_ref(struct bsc_connection *bsc, struct bsc_nat_parsed *parsed);
Holger Hans Peter Freyther49c7fb52010-06-15 18:48:55 +0800337int update_sccp_src_ref(struct sccp_connections *sccp, struct bsc_nat_parsed *parsed);
Holger Hans Peter Freyther0ab6bab2010-06-15 18:47:49 +0800338void remove_sccp_src_ref(struct bsc_connection *bsc, struct msgb *msg, struct bsc_nat_parsed *parsed);
Holger Hans Peter Freyther49c7fb52010-06-15 18:48:55 +0800339struct sccp_connections *patch_sccp_src_ref_to_bsc(struct msgb *, struct bsc_nat_parsed *, struct bsc_nat *);
Holger Hans Peter Freytherb5513ca2010-04-21 18:56:12 +0800340struct sccp_connections *patch_sccp_src_ref_to_msc(struct msgb *, struct bsc_nat_parsed *, struct bsc_connection *);
Holger Hans Peter Freyther3d387422010-10-16 16:35:00 +0200341struct sccp_connections *bsc_nat_find_con_by_bsc(struct bsc_nat *, struct sccp_source_reference *);
Holger Hans Peter Freyther0ab6bab2010-06-15 18:47:49 +0800342
Holger Hans Peter Freyther465313e2010-06-15 18:49:53 +0800343/**
344 * MGCP/Audio handling
345 */
Holger Hans Peter Freyther9ec030d2011-02-27 11:04:27 +0100346int bsc_mgcp_nr_multiplexes(int max_endpoints);
Holger Hans Peter Freytherdbd16fe2010-07-23 19:08:55 +0800347int bsc_write_mgcp(struct bsc_connection *bsc, const uint8_t *data, unsigned int length);
Holger Hans Peter Freyther45fd07d2010-08-28 18:22:14 +0800348int bsc_mgcp_assign_patch(struct sccp_connections *, struct msgb *msg);
Holger Hans Peter Freyther7b7eef62010-04-22 12:08:17 +0800349void bsc_mgcp_init(struct sccp_connections *);
350void bsc_mgcp_dlcx(struct sccp_connections *);
Holger Hans Peter Freyther241e1302010-03-31 09:16:56 +0200351void bsc_mgcp_free_endpoints(struct bsc_nat *nat);
Holger Hans Peter Freyther7b7eef62010-04-22 12:08:17 +0800352int bsc_mgcp_nat_init(struct bsc_nat *nat);
Holger Hans Peter Freyther465313e2010-06-15 18:49:53 +0800353
Holger Hans Peter Freyther08a1b162010-04-18 02:26:16 +0800354struct sccp_connections *bsc_mgcp_find_con(struct bsc_nat *, int endpoint_number);
Holger Hans Peter Freytherf7c86c52010-08-30 13:44:32 +0800355struct msgb *bsc_mgcp_rewrite(char *input, int length, int endp, const char *ip, int port);
Holger Hans Peter Freyther3c3bce12010-04-01 10:16:28 +0200356void bsc_mgcp_forward(struct bsc_connection *bsc, struct msgb *msg);
357
Holger Hans Peter Freyther26a43892010-04-05 23:09:27 +0200358void bsc_mgcp_clear_endpoints_for(struct bsc_connection *bsc);
Holger Hans Peter Freyther3c3bce12010-04-01 10:16:28 +0200359int bsc_mgcp_parse_response(const char *str, int *code, char transaction[60]);
Holger Hans Peter Freyther46340132010-08-06 08:26:54 +0800360uint32_t bsc_mgcp_extract_ci(const char *resp);
Holger Hans Peter Freytherfc9bd232010-04-01 03:55:27 +0200361
Holger Hans Peter Freyther2896df72010-04-08 10:24:57 +0200362
363int bsc_write(struct bsc_connection *bsc, struct msgb *msg, int id);
Pablo Neira Ayusoe1273b12011-05-06 12:09:47 +0200364int bsc_do_write(struct osmo_wqueue *queue, struct msgb *msg, int id);
365int bsc_write_msg(struct osmo_wqueue *queue, struct msgb *msg);
Pablo Neira Ayuso4db92992011-05-06 12:11:23 +0200366int bsc_write_cb(struct osmo_fd *bfd, struct msgb *msg);
Holger Hans Peter Freyther2896df72010-04-08 10:24:57 +0200367
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +0800368/* IMSI allow/deny handling */
Holger Hans Peter Freyther4c9557e2011-04-04 19:19:26 +0200369int bsc_parse_reg(void *ctx, regex_t *reg, char **imsi, int argc, const char **argv) __attribute__ ((warn_unused_result));
Holger Hans Peter Freyther29c67032010-06-08 10:14:44 +0800370struct bsc_nat_acc_lst *bsc_nat_acc_lst_find(struct bsc_nat *nat, const char *name);
371struct bsc_nat_acc_lst *bsc_nat_acc_lst_get(struct bsc_nat *nat, const char *name);
372void bsc_nat_acc_lst_delete(struct bsc_nat_acc_lst *lst);
Holger Hans Peter Freyther12dc89a2010-05-14 18:38:29 +0800373
Holger Hans Peter Freytherd77c8172010-06-08 10:53:39 +0800374struct bsc_nat_acc_lst_entry *bsc_nat_acc_lst_entry_create(struct bsc_nat_acc_lst *);
Holger Hans Peter Freytherc1cac1e2010-10-11 09:50:31 +0200375int bsc_nat_lst_check_allow(struct bsc_nat_acc_lst *lst, const char *imsi);
Holger Hans Peter Freytherd77c8172010-06-08 10:53:39 +0800376
Holger Hans Peter Freyther20ee3122010-07-05 14:39:44 +0800377int bsc_nat_msc_is_connected(struct bsc_nat *nat);
378
Holger Hans Peter Freyther463dc622010-10-03 19:41:42 +0800379int bsc_conn_type_to_ctr(struct sccp_connections *conn);
380
Holger Hans Peter Freythera3967572010-09-29 02:30:50 +0800381struct gsm48_hdr *bsc_unpack_dtap(struct bsc_nat_parsed *parsed, struct msgb *msg, uint32_t *len);
382
Holger Hans Peter Freyther17870cf2010-09-29 19:32:55 +0800383/** USSD filtering */
Holger Hans Peter Freytherc16c2dc2010-10-13 20:22:36 +0200384int bsc_ussd_init(struct bsc_nat *nat);
Holger Hans Peter Freyther17870cf2010-09-29 19:32:55 +0800385int bsc_check_ussd(struct sccp_connections *con, struct bsc_nat_parsed *parsed, struct msgb *msg);
Holger Hans Peter Freyther54f53522010-10-27 11:01:55 +0200386int bsc_close_ussd_connections(struct bsc_nat *nat);
Holger Hans Peter Freyther17870cf2010-09-29 19:32:55 +0800387
Holger Hans Peter Freyther73bbf892010-10-21 14:46:57 +0200388struct msgb *bsc_nat_rewrite_setup(struct bsc_nat *nat, struct msgb *msg, struct bsc_nat_parsed *, const char *imsi);
Holger Hans Peter Freythera914daf2010-10-21 12:12:57 +0200389
Holger Hans Peter Freyther6860c442011-05-02 19:16:13 +0200390/** paging group handling */
391struct bsc_nat_paging_group *bsc_nat_paging_group_num(struct bsc_nat *nat, int group);
392struct bsc_nat_paging_group *bsc_nat_paging_group_create(struct bsc_nat *nat, int group);
393void bsc_nat_paging_group_delete(struct bsc_nat_paging_group *);
394void bsc_nat_paging_group_add_lac(struct bsc_nat_paging_group *grp, int lac);
395void bsc_nat_paging_group_del_lac(struct bsc_nat_paging_group *grp, int lac);
396
Holger Hans Peter Freyther6a97b8d2010-06-15 18:45:26 +0800397#endif