blob: 5ccc02e18e08b06a5e963c34fce681ae33dc305e [file] [log] [blame]
Holger Hans Peter Freyther6a97b8d2010-06-15 18:45:26 +08001/*
Holger Hans Peter Freytherd2361d92012-12-03 15:32:54 +01002 * (C) 2010-2012 by Holger Hans Peter Freyther <zecke@selfish.org>
3 * (C) 2010-2012 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"
Holger Hans Peter Freyther4ba947b2015-04-05 18:07:45 +020025#include "bsc_msg_filter.h"
Holger Hans Peter Freytherf7d33352010-06-15 18:50:26 +080026
Holger Hans Peter Freyther9f8f3d02010-02-07 13:08:09 +010027
Pablo Neira Ayuso136f4532011-03-22 16:47:59 +010028#include <osmocom/core/select.h>
29#include <osmocom/core/msgb.h>
30#include <osmocom/core/msgfile.h>
31#include <osmocom/core/timer.h>
32#include <osmocom/core/write_queue.h>
33#include <osmocom/core/rate_ctr.h>
34#include <osmocom/core/statistics.h>
35#include <osmocom/gsm/protocol/gsm_04_08.h>
Holger Hans Peter Freyther6a97b8d2010-06-15 18:45:26 +080036
Holger Hans Peter Freytherc16cf272010-04-13 09:24:37 +020037#include <regex.h>
38
Holger Hans Peter Freyther1d6fb182010-01-30 11:53:30 +010039#define DIR_BSC 1
40#define DIR_MSC 2
Holger Hans Peter Freyther0b8f69d2010-06-15 18:45:38 +080041
Holger Hans Peter Freyther474698a2011-05-02 16:50:36 +020042#define PAGIN_GROUP_UNASSIGNED -1
43
Holger Hans Peter Freyther3d387422010-10-16 16:35:00 +020044struct sccp_source_reference;
Holger Hans Peter Freytherc279e392013-04-16 09:53:13 +020045struct nat_sccp_connection;
Holger Hans Peter Freytherc2b31ed2010-07-31 05:17:17 +080046struct bsc_nat_parsed;
Holger Hans Peter Freytheraa698242010-06-15 18:46:19 +080047struct bsc_nat;
Holger Hans Peter Freytherc16c2dc2010-10-13 20:22:36 +020048struct bsc_nat_ussd_con;
Holger Hans Peter Freytherddf191e2013-06-25 11:44:01 +020049struct nat_rewrite_rule;
Holger Hans Peter Freytheraa698242010-06-15 18:46:19 +080050
Holger Hans Peter Freyther0b8f69d2010-06-15 18:45:38 +080051/*
Holger Hans Peter Freythere5d32492011-04-16 16:02:59 +020052 * Is this terminated to the MSC, to the local machine (release
53 * handling for IMSI filtering) or to a USSD provider?
54 */
55enum {
56 NAT_CON_END_MSC,
57 NAT_CON_END_LOCAL,
58 NAT_CON_END_USSD,
59};
60
61/*
Daniel Willmanna86bc392011-02-18 14:32:56 +010062 * Pending command entry
63 */
64struct bsc_cmd_list {
65 struct llist_head list_entry;
66
67 struct osmo_timer_list timeout;
68
69 /* The NATed ID used on the bsc_con*/
70 int nat_id;
71
72 /* The control connection from which the command originated */
73 struct ctrl_connection *ccon;
74
75 /* The command from the control connection */
76 struct ctrl_cmd *cmd;
77};
78
79/*
Holger Hans Peter Freyther9f8f3d02010-02-07 13:08:09 +010080 * Per BSC data structure
81 */
82struct bsc_connection {
83 struct llist_head list_entry;
84
85 /* do we know anything about this BSC? */
86 int authenticated;
Holger Hans Peter Freyther97056712015-06-08 16:28:15 +020087 uint8_t last_rand[16];
Holger Hans Peter Freyther9f8f3d02010-02-07 13:08:09 +010088
89 /* the fd we use to communicate */
Pablo Neira Ayusoe1273b12011-05-06 12:09:47 +020090 struct osmo_wqueue write_queue;
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +080091
Jacob Erlbecke8278122014-03-31 13:42:11 +020092 /* incoming message buffer */
93 struct msgb *pending_msg;
94
Holger Hans Peter Freyther47dd4942010-04-06 15:11:34 +020095 /* the BSS associated */
96 struct bsc_config *cfg;
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +080097
98 /* a timeout node */
Pablo Neira Ayusobf540cb2011-05-06 12:11:06 +020099 struct osmo_timer_list id_timeout;
Holger Hans Peter Freytheraa698242010-06-15 18:46:19 +0800100
Holger Hans Peter Freyther906c15e2010-05-02 19:28:59 +0800101 /* pong timeout */
Pablo Neira Ayusobf540cb2011-05-06 12:11:06 +0200102 struct osmo_timer_list ping_timeout;
103 struct osmo_timer_list pong_timeout;
Holger Hans Peter Freyther906c15e2010-05-02 19:28:59 +0800104
Holger Hans Peter Freyther45fd07d2010-08-28 18:22:14 +0800105 /* mgcp related code */
Holger Hans Peter Freythered500e32011-02-25 17:09:07 +0100106 char *_endpoint_status;
Holger Hans Peter Freythera9e93312011-02-26 11:38:00 +0100107 int number_multiplexes;
Holger Hans Peter Freyther9ec030d2011-02-27 11:04:27 +0100108 int max_endpoints;
Holger Hans Peter Freyther45fd07d2010-08-28 18:22:14 +0800109 int last_endpoint;
Holger Hans Peter Freyther462b7d72012-10-24 21:53:40 +0200110 int next_transaction;
111 uint32_t pending_dlcx_count;
112 struct llist_head pending_dlcx;
Holger Hans Peter Freyther45fd07d2010-08-28 18:22:14 +0800113
Daniel Willmanna86bc392011-02-18 14:32:56 +0100114 /* track the pending commands for this BSC */
115 struct llist_head cmd_pending;
116 int last_id;
117
Holger Hans Peter Freytheraa698242010-06-15 18:46:19 +0800118 /* a back pointer */
119 struct bsc_nat *nat;
Holger Hans Peter Freyther9f8f3d02010-02-07 13:08:09 +0100120};
121
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800122/**
Holger Hans Peter Freytherd4702862010-04-12 12:17:09 +0200123 * Stats per BSC
124 */
125struct bsc_config_stats {
Holger Hans Peter Freytherb2c38eb2010-06-17 18:16:00 +0800126 struct rate_ctr_group *ctrg;
127};
Holger Hans Peter Freytherd4702862010-04-12 12:17:09 +0200128
Holger Hans Peter Freytherb2c38eb2010-06-17 18:16:00 +0800129enum bsc_cfg_ctr {
130 BCFG_CTR_SCCP_CONN,
131 BCFG_CTR_SCCP_CALLS,
132 BCFG_CTR_NET_RECONN,
Holger Hans Peter Freyther8330c1c2010-06-17 18:29:42 +0800133 BCFG_CTR_DROPPED_SCCP,
134 BCFG_CTR_DROPPED_CALLS,
Holger Hans Peter Freytheree884962010-09-25 17:58:22 +0800135 BCFG_CTR_REJECTED_CR,
136 BCFG_CTR_REJECTED_MSG,
137 BCFG_CTR_ILL_PACKET,
Holger Hans Peter Freyther463dc622010-10-03 19:41:42 +0800138 BCFG_CTR_CON_TYPE_LU,
139 BCFG_CTR_CON_CMSERV_RQ,
140 BCFG_CTR_CON_PAG_RESP,
Holger Hans Peter Freyther74dc3032010-09-29 02:47:29 +0800141 BCFG_CTR_CON_SSA,
Holger Hans Peter Freyther463dc622010-10-03 19:41:42 +0800142 BCFG_CTR_CON_OTHER,
Holger Hans Peter Freytherd4702862010-04-12 12:17:09 +0200143};
144
145/**
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800146 * One BSC entry in the config
147 */
148struct bsc_config {
149 struct llist_head entry;
150
Holger Hans Peter Freyther694d9802015-06-08 18:33:28 +0200151 uint8_t key[16];
152 uint8_t key_present;
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800153 char *token;
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800154 int nr;
155
Holger Hans Peter Freytherb6061012010-05-14 22:06:28 +0800156 char *description;
157
Holger Hans Peter Freytherc16cf272010-04-13 09:24:37 +0200158 /* imsi white and blacklist */
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +0800159 char *acc_lst_name;
Holger Hans Peter Freytherc16cf272010-04-13 09:24:37 +0200160
Holger Hans Peter Freyther62e58432010-04-21 19:05:14 +0800161 int forbid_paging;
Holger Hans Peter Freyther474698a2011-05-02 16:50:36 +0200162 int paging_group;
Holger Hans Peter Freyther62e58432010-04-21 19:05:14 +0800163
Holger Hans Peter Freythered500e32011-02-25 17:09:07 +0100164 /* audio handling */
Holger Hans Peter Freyther9ec030d2011-02-27 11:04:27 +0100165 int max_endpoints;
Holger Hans Peter Freythered500e32011-02-25 17:09:07 +0100166
Holger Hans Peter Freytherc16cf272010-04-13 09:24:37 +0200167 /* backpointer */
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800168 struct bsc_nat *nat;
Holger Hans Peter Freytherd4702862010-04-12 12:17:09 +0200169
170 struct bsc_config_stats stats;
Holger Hans Peter Freyther0bd60f32010-10-08 22:08:29 +0800171
172 struct llist_head lac_list;
Pablo Neira Ayusocab6e752014-02-05 18:56:17 +0100173
174 /* Osmux is enabled/disabled per BSC */
175 int osmux;
Holger Hans Peter Freyther0bd60f32010-10-08 22:08:29 +0800176};
177
178struct bsc_lac_entry {
179 struct llist_head entry;
180 uint16_t lac;
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800181};
182
Holger Hans Peter Freyther474698a2011-05-02 16:50:36 +0200183struct bsc_nat_paging_group {
184 struct llist_head entry;
185
186 /* list of lac entries */
187 struct llist_head lists;
188 int nr;
189};
190
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800191/**
Holger Hans Peter Freythera0df82d2010-04-01 08:21:33 +0200192 * BSCs point of view of endpoints
193 */
194struct bsc_endpoint {
Holger Hans Peter Freyther5b2726e2010-08-06 09:05:05 +0800195 /* the operation that is carried out */
196 int transaction_state;
Holger Hans Peter Freythera0df82d2010-04-01 08:21:33 +0200197 /* the pending transaction id */
198 char *transaction_id;
199 /* the bsc we are talking to */
200 struct bsc_connection *bsc;
201};
202
203/**
Holger Hans Peter Freytherd4702862010-04-12 12:17:09 +0200204 * Statistic for the nat.
205 */
206struct bsc_nat_statistics {
207 struct {
Pablo Neira Ayusodfb342c2011-05-06 12:13:10 +0200208 struct osmo_counter *conn;
209 struct osmo_counter *calls;
Holger Hans Peter Freytherd4702862010-04-12 12:17:09 +0200210 } sccp;
211
212 struct {
Pablo Neira Ayusodfb342c2011-05-06 12:13:10 +0200213 struct osmo_counter *reconn;
214 struct osmo_counter *auth_fail;
Holger Hans Peter Freytherd4702862010-04-12 12:17:09 +0200215 } bsc;
216
217 struct {
Pablo Neira Ayusodfb342c2011-05-06 12:13:10 +0200218 struct osmo_counter *reconn;
Holger Hans Peter Freytherd4702862010-04-12 12:17:09 +0200219 } msc;
Holger Hans Peter Freytherc16c2dc2010-10-13 20:22:36 +0200220
221 struct {
Pablo Neira Ayusodfb342c2011-05-06 12:13:10 +0200222 struct osmo_counter *reconn;
Holger Hans Peter Freytherc16c2dc2010-10-13 20:22:36 +0200223 } ussd;
Holger Hans Peter Freytherd4702862010-04-12 12:17:09 +0200224};
225
226/**
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 Freytherc3271872012-11-05 14:54:56 +0100251 int mgcp_ipa;
Holger Hans Peter Freyther7f100c92015-04-23 20:25:17 -0400252 int sdp_ensure_amr_mode_set;
Holger Hans Peter Freythera0df82d2010-04-01 08:21:33 +0200253
Holger Hans Peter Freytherb7527612010-04-07 11:20:36 +0200254 /* msc things */
Holger Hans Peter Freythere1880102011-04-23 23:31:31 +0200255 struct llist_head dests;
256 struct bsc_msc_dest *main_dest;
Holger Hans Peter Freytheraad82ce2010-05-11 19:07:39 +0800257 struct bsc_msc_connection *msc_con;
Holger Hans Peter Freythere635dab2010-05-15 00:14:58 +0800258 char *token;
Holger Hans Peter Freytherb7527612010-04-07 11:20:36 +0200259
Holger Hans Peter Freytherda35a8d2010-05-05 16:57:38 +0800260 /* timeouts */
261 int auth_timeout;
262 int ping_timeout;
263 int pong_timeout;
264
Holger Hans Peter Freythera0df82d2010-04-01 08:21:33 +0200265 struct bsc_endpoint *bsc_endpoints;
Holger Hans Peter Freytherd4702862010-04-12 12:17:09 +0200266
Max82f5ecd2016-04-12 16:59:25 +0200267 /* path to file with BSC config */
268 char *include_file;
269 char *include_base;
270 char *resolved_path;
271
Holger Hans Peter Freytherc16cf272010-04-13 09:24:37 +0200272 /* filter */
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +0800273 char *acc_lst_name;
Holger Hans Peter Freytherc16cf272010-04-13 09:24:37 +0200274
Holger Hans Peter Freyther1f8276e2013-01-01 11:25:09 +0100275 /* Barring of subscribers with a rb tree */
276 struct rb_root imsi_black_list;
277 char *imsi_black_list_fn;
278
Holger Hans Peter Freyther76424392010-10-21 10:59:54 +0200279 /* number rewriting */
280 char *num_rewr_name;
Holger Hans Peter Freytherad75eab2011-05-27 12:38:58 +0200281 struct llist_head num_rewr;
Holger Hans Peter Freyther67e423c2013-06-25 15:38:31 +0200282 char *num_rewr_post_name;
283 struct llist_head num_rewr_post;
Holger Hans Peter Freyther76424392010-10-21 10:59:54 +0200284
Holger Hans Peter Freyther9c205712011-05-27 17:14:15 +0200285 char *smsc_rewr_name;
286 struct llist_head smsc_rewr;
Holger Hans Peter Freytheracc40312011-05-27 19:21:24 +0200287 char *tpdest_match_name;
288 struct llist_head tpdest_match;
Holger Hans Peter Freyther68368dd2012-01-10 22:39:07 +0100289 char *sms_clear_tp_srr_name;
290 struct llist_head sms_clear_tp_srr;
Holger Hans Peter Freyther8e60f622012-01-18 20:00:28 +0100291 char *sms_num_rewr_name;
292 struct llist_head sms_num_rewr;
Holger Hans Peter Freyther9c205712011-05-27 17:14:15 +0200293
Holger Hans Peter Freytherddf191e2013-06-25 11:44:01 +0200294 /* more rewriting */
295 char *num_rewr_trie_name;
296 struct nat_rewrite *num_rewr_trie;
297
Holger Hans Peter Freytherd1effd82010-10-10 17:29:20 +0200298 /* USSD messages we want to match */
299 char *ussd_lst_name;
Holger Hans Peter Freytherc1578bc2010-10-11 10:06:39 +0200300 char *ussd_query;
Holger Hans Peter Freythera18b1162011-04-01 17:32:21 +0200301 regex_t ussd_query_re;
Holger Hans Peter Freythere393f272010-10-12 18:25:52 +0200302 char *ussd_token;
303 char *ussd_local;
Pablo Neira Ayuso4db92992011-05-06 12:11:23 +0200304 struct osmo_fd ussd_listen;
Holger Hans Peter Freytherc16c2dc2010-10-13 20:22:36 +0200305 struct bsc_nat_ussd_con *ussd_con;
Holger Hans Peter Freytherd1effd82010-10-10 17:29:20 +0200306
Holger Hans Peter Freytherde2b8602011-04-23 23:55:14 +0200307 /* for maintainenance */
308 int blocked;
309
Holger Hans Peter Freytherd4702862010-04-12 12:17:09 +0200310 /* statistics */
311 struct bsc_nat_statistics stats;
Daniel Willmann6fc4a982011-07-22 17:55:42 +0200312
313 /* control interface */
314 struct ctrl_handle *ctrl;
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800315};
316
Holger Hans Peter Freyther91b9a452011-04-16 17:01:47 +0200317struct bsc_nat_ussd_con {
Pablo Neira Ayusoe1273b12011-05-06 12:09:47 +0200318 struct osmo_wqueue queue;
Holger Hans Peter Freyther91b9a452011-04-16 17:01:47 +0200319 struct bsc_nat *nat;
320 int authorized;
321
Jacob Erlbecke8278122014-03-31 13:42:11 +0200322 struct msgb *pending_msg;
323
Pablo Neira Ayusobf540cb2011-05-06 12:11:06 +0200324 struct osmo_timer_list auth_timeout;
Holger Hans Peter Freyther91b9a452011-04-16 17:01:47 +0200325};
326
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800327/* create and init the structures */
Max714b1702016-04-07 12:27:11 +0200328struct bsc_config *bsc_config_alloc(struct bsc_nat *nat, const char *token,
329 unsigned int number);
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800330struct bsc_config *bsc_config_num(struct bsc_nat *nat, int num);
Holger Hans Peter Freytheraa0cecd2015-06-08 09:54:45 +0200331struct bsc_config *bsc_config_by_token(struct bsc_nat *nat, const char *token, int len);
Holger Hans Peter Freyther9212d9d2011-02-27 11:18:41 +0100332void bsc_config_free(struct bsc_config *);
Holger Hans Peter Freyther0bd60f32010-10-08 22:08:29 +0800333void bsc_config_add_lac(struct bsc_config *cfg, int lac);
334void bsc_config_del_lac(struct bsc_config *cfg, int lac);
335int bsc_config_handles_lac(struct bsc_config *cfg, int lac);
336
Holger Hans Peter Freytherdcf8a7d2010-06-15 18:48:01 +0800337struct bsc_nat *bsc_nat_alloc(void);
338struct bsc_connection *bsc_connection_alloc(struct bsc_nat *nat);
Holger Hans Peter Freythera88742c2010-06-15 18:51:04 +0800339void bsc_nat_set_msc_ip(struct bsc_nat *bsc, const char *ip);
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800340
Holger Hans Peter Freytherc279e392013-04-16 09:53:13 +0200341void sccp_connection_destroy(struct nat_sccp_connection *);
Holger Hans Peter Freyther2f9dcf02010-04-27 13:21:39 +0800342void bsc_close_connection(struct bsc_connection *);
Holger Hans Peter Freyther9f8f3d02010-02-07 13:08:09 +0100343
Holger Hans Peter Freyther234d3122010-05-16 02:06:11 +0800344const char *bsc_con_type_to_string(int type);
345
Holger Hans Peter Freyther0b8f69d2010-06-15 18:45:38 +0800346/**
347 * parse the given message into the above structure
348 */
349struct bsc_nat_parsed *bsc_nat_parse(struct msgb *msg);
350
Holger Hans Peter Freyther6a97b8d2010-06-15 18:45:26 +0800351/**
352 * filter based on IP Access header in both directions
353 */
Holger Hans Peter Freyther1d6fb182010-01-30 11:53:30 +0100354int bsc_nat_filter_ipa(int direction, struct msgb *msg, struct bsc_nat_parsed *parsed);
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800355int bsc_nat_vty_init(struct bsc_nat *nat);
Holger Hans Peter Freyther1ffe98c2011-05-02 16:20:32 +0200356int bsc_nat_find_paging(struct msgb *msg, const uint8_t **,int *len);
Holger Hans Peter Freyther6a97b8d2010-06-15 18:45:26 +0800357
Holger Hans Peter Freyther0ab6bab2010-06-15 18:47:49 +0800358/**
359 * SCCP patching and handling
360 */
Holger Hans Peter Freytherc279e392013-04-16 09:53:13 +0200361struct nat_sccp_connection *create_sccp_src_ref(struct bsc_connection *bsc, struct bsc_nat_parsed *parsed);
362int update_sccp_src_ref(struct nat_sccp_connection *sccp, struct bsc_nat_parsed *parsed);
Holger Hans Peter Freyther0ab6bab2010-06-15 18:47:49 +0800363void remove_sccp_src_ref(struct bsc_connection *bsc, struct msgb *msg, struct bsc_nat_parsed *parsed);
Holger Hans Peter Freytherc279e392013-04-16 09:53:13 +0200364struct nat_sccp_connection *patch_sccp_src_ref_to_bsc(struct msgb *, struct bsc_nat_parsed *, struct bsc_nat *);
365struct nat_sccp_connection *patch_sccp_src_ref_to_msc(struct msgb *, struct bsc_nat_parsed *, struct bsc_connection *);
366struct nat_sccp_connection *bsc_nat_find_con_by_bsc(struct bsc_nat *, struct sccp_source_reference *);
Holger Hans Peter Freyther0ab6bab2010-06-15 18:47:49 +0800367
Holger Hans Peter Freyther465313e2010-06-15 18:49:53 +0800368/**
369 * MGCP/Audio handling
370 */
Holger Hans Peter Freyther9ec030d2011-02-27 11:04:27 +0100371int bsc_mgcp_nr_multiplexes(int max_endpoints);
Holger Hans Peter Freytherdbd16fe2010-07-23 19:08:55 +0800372int bsc_write_mgcp(struct bsc_connection *bsc, const uint8_t *data, unsigned int length);
Holger Hans Peter Freytherc279e392013-04-16 09:53:13 +0200373int bsc_mgcp_assign_patch(struct nat_sccp_connection *, struct msgb *msg);
374void bsc_mgcp_init(struct nat_sccp_connection *);
375void bsc_mgcp_dlcx(struct nat_sccp_connection *);
Holger Hans Peter Freyther241e1302010-03-31 09:16:56 +0200376void bsc_mgcp_free_endpoints(struct bsc_nat *nat);
Holger Hans Peter Freyther7b7eef62010-04-22 12:08:17 +0800377int bsc_mgcp_nat_init(struct bsc_nat *nat);
Holger Hans Peter Freyther465313e2010-06-15 18:49:53 +0800378
Holger Hans Peter Freytherc279e392013-04-16 09:53:13 +0200379struct nat_sccp_connection *bsc_mgcp_find_con(struct bsc_nat *, int endpoint_number);
Jacob Erlbeck3dff27d2013-11-29 13:43:48 +0100380struct msgb *bsc_mgcp_rewrite(char *input, int length, int endp, const char *ip,
Holger Hans Peter Freythere9f7c992015-08-13 18:31:09 +0200381 int port, int osmux, int *first_payload_type, int mode_set);
Holger Hans Peter Freyther3c3bce12010-04-01 10:16:28 +0200382void bsc_mgcp_forward(struct bsc_connection *bsc, struct msgb *msg);
383
Holger Hans Peter Freyther26a43892010-04-05 23:09:27 +0200384void bsc_mgcp_clear_endpoints_for(struct bsc_connection *bsc);
Holger Hans Peter Freyther3c3bce12010-04-01 10:16:28 +0200385int bsc_mgcp_parse_response(const char *str, int *code, char transaction[60]);
Holger Hans Peter Freyther46340132010-08-06 08:26:54 +0800386uint32_t bsc_mgcp_extract_ci(const char *resp);
Holger Hans Peter Freytherfc9bd232010-04-01 03:55:27 +0200387
Holger Hans Peter Freyther2896df72010-04-08 10:24:57 +0200388
389int bsc_write(struct bsc_connection *bsc, struct msgb *msg, int id);
Pablo Neira Ayusoe1273b12011-05-06 12:09:47 +0200390int bsc_do_write(struct osmo_wqueue *queue, struct msgb *msg, int id);
391int bsc_write_msg(struct osmo_wqueue *queue, struct msgb *msg);
Pablo Neira Ayuso4db92992011-05-06 12:11:23 +0200392int bsc_write_cb(struct osmo_fd *bfd, struct msgb *msg);
Holger Hans Peter Freyther2896df72010-04-08 10:24:57 +0200393
Holger Hans Peter Freyther20ee3122010-07-05 14:39:44 +0800394int bsc_nat_msc_is_connected(struct bsc_nat *nat);
395
Holger Hans Peter Freytherc279e392013-04-16 09:53:13 +0200396int bsc_conn_type_to_ctr(struct nat_sccp_connection *conn);
Holger Hans Peter Freyther463dc622010-10-03 19:41:42 +0800397
Holger Hans Peter Freythera3967572010-09-29 02:30:50 +0800398struct gsm48_hdr *bsc_unpack_dtap(struct bsc_nat_parsed *parsed, struct msgb *msg, uint32_t *len);
399
Holger Hans Peter Freyther17870cf2010-09-29 19:32:55 +0800400/** USSD filtering */
Holger Hans Peter Freytherc16c2dc2010-10-13 20:22:36 +0200401int bsc_ussd_init(struct bsc_nat *nat);
Holger Hans Peter Freyther6fcc3a92013-08-26 14:04:43 +0200402int bsc_ussd_check(struct nat_sccp_connection *con, struct bsc_nat_parsed *parsed, struct msgb *msg);
403int bsc_ussd_close_connections(struct bsc_nat *nat);
Holger Hans Peter Freyther17870cf2010-09-29 19:32:55 +0800404
Holger Hans Peter Freytherdf8e6e92011-05-27 14:09:55 +0200405struct msgb *bsc_nat_rewrite_msg(struct bsc_nat *nat, struct msgb *msg, struct bsc_nat_parsed *, const char *imsi);
Holger Hans Peter Freythera914daf2010-10-21 12:12:57 +0200406
Holger Hans Peter Freyther6860c442011-05-02 19:16:13 +0200407/** paging group handling */
408struct bsc_nat_paging_group *bsc_nat_paging_group_num(struct bsc_nat *nat, int group);
409struct bsc_nat_paging_group *bsc_nat_paging_group_create(struct bsc_nat *nat, int group);
410void bsc_nat_paging_group_delete(struct bsc_nat_paging_group *);
411void bsc_nat_paging_group_add_lac(struct bsc_nat_paging_group *grp, int lac);
412void bsc_nat_paging_group_del_lac(struct bsc_nat_paging_group *grp, int lac);
413
Holger Hans Peter Freytherad75eab2011-05-27 12:38:58 +0200414/**
415 * Number rewriting support below
416 */
417struct bsc_nat_num_rewr_entry {
418 struct llist_head list;
419
420 regex_t msisdn_reg;
421 regex_t num_reg;
422
423 char *replace;
Holger Hans Peter Freytherddf191e2013-06-25 11:44:01 +0200424 uint8_t is_prefix_lookup;
Holger Hans Peter Freytherad75eab2011-05-27 12:38:58 +0200425};
426
Holger Hans Peter Freyther9c205712011-05-27 17:14:15 +0200427void bsc_nat_num_rewr_entry_adapt(void *ctx, struct llist_head *head, const struct osmo_config_list *);
Holger Hans Peter Freytherad75eab2011-05-27 12:38:58 +0200428
Holger Hans Peter Freytherc3271872012-11-05 14:54:56 +0100429void bsc_nat_send_mgcp_to_msc(struct bsc_nat *bsc_nat, struct msgb *msg);
430void bsc_nat_handle_mgcp(struct bsc_nat *bsc, struct msgb *msg);
431
Neels Hofmeyr73828152016-02-23 15:10:33 +0100432struct ctrl_handle *bsc_nat_controlif_setup(struct bsc_nat *nat,
433 const char *bind_addr, int port);
Holger Hans Peter Freyther98da5442012-11-05 16:04:10 +0100434void bsc_nat_ctrl_del_pending(struct bsc_cmd_list *pending);
435int bsc_nat_handle_ctrlif_msg(struct bsc_connection *bsc, struct msgb *msg);
436
Holger Hans Peter Freytherb2b291d2013-04-16 13:23:43 +0200437int bsc_nat_extract_lac(struct bsc_connection *bsc, struct nat_sccp_connection *con,
438 struct bsc_nat_parsed *parsed, struct msgb *msg);
439
Holger Hans Peter Freyther4ba947b2015-04-05 18:07:45 +0200440int bsc_nat_filter_sccp_cr(struct bsc_connection *bsc, struct msgb *msg,
441 struct bsc_nat_parsed *, int *con_type, char **imsi,
442 struct bsc_filter_reject_cause *cause);
443int bsc_nat_filter_dt(struct bsc_connection *bsc, struct msgb *msg,
444 struct nat_sccp_connection *con, struct bsc_nat_parsed *parsed,
445 struct bsc_filter_reject_cause *cause);
446
Holger Hans Peter Freyther7c009832015-04-05 13:45:53 +0200447/**
448 * CTRL interface helper
449 */
450void bsc_nat_inform_reject(struct bsc_connection *bsc, const char *imsi);
Holger Hans Peter Freyther73ec6982014-08-29 09:56:58 +0200451
452/*
453 * Use for testing
454 */
455void bsc_nat_free(struct bsc_nat *nat);
456
Holger Hans Peter Freyther6a97b8d2010-06-15 18:45:26 +0800457#endif