blob: 083746f68fce4e409818cbcf294aec1ea5a1d216 [file] [log] [blame]
Holger Hans Peter Freyther6a97b8d2010-06-15 18:45:26 +08001/*
2 * (C) 2010 by Holger Hans Peter Freyther <zecke@selfish.org>
Holger Hans Peter Freytherdf6143a2010-06-15 18:46:56 +08003 * (C) 2010 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
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (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
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License along
17 * with this program; if not, write to the Free Software Foundation, Inc.,
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19 *
20 */
21
22#ifndef BSC_NAT_H
23#define BSC_NAT_H
24
Holger Hans Peter Freytherf7d33352010-06-15 18:50:26 +080025#include "mgcp.h"
26
Holger Hans Peter Freyther6a97b8d2010-06-15 18:45:26 +080027#include <sys/types.h>
Holger Hans Peter Freyther9f8f3d02010-02-07 13:08:09 +010028
Holger Hans Peter Freyther6c45f2e2010-06-15 19:06:18 +080029#include <osmocore/select.h>
30#include <osmocore/msgb.h>
Holger Hans Peter Freyther76424392010-10-21 10:59:54 +020031#include <osmocore/msgfile.h>
Holger Hans Peter Freyther6c45f2e2010-06-15 19:06:18 +080032#include <osmocore/timer.h>
Holger Hans Peter Freythered07a3f2010-06-15 18:47:10 +080033#include <osmocore/write_queue.h>
Holger Hans Peter Freytherb2c38eb2010-06-17 18:16:00 +080034#include <osmocore/rate_ctr.h>
Holger Hans Peter Freytherd4702862010-04-12 12:17:09 +020035#include <osmocore/statistics.h>
Holger Hans Peter Freythera3967572010-09-29 02:30:50 +080036#include <osmocore/protocol/gsm_04_08.h>
Holger Hans Peter Freyther6a97b8d2010-06-15 18:45:26 +080037
Holger Hans Peter Freytherc16cf272010-04-13 09:24:37 +020038#include <regex.h>
39
Holger Hans Peter Freyther1d6fb182010-01-30 11:53:30 +010040#define DIR_BSC 1
41#define DIR_MSC 2
Holger Hans Peter Freyther0b8f69d2010-06-15 18:45:38 +080042
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 Freyther9f8f3d02010-02-07 13:08:09 +010060 * Per BSC data structure
61 */
62struct bsc_connection {
63 struct llist_head list_entry;
64
65 /* do we know anything about this BSC? */
66 int authenticated;
67
68 /* the fd we use to communicate */
Holger Hans Peter Freythered07a3f2010-06-15 18:47:10 +080069 struct write_queue write_queue;
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +080070
Holger Hans Peter Freyther47dd4942010-04-06 15:11:34 +020071 /* the BSS associated */
72 struct bsc_config *cfg;
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +080073
74 /* a timeout node */
75 struct timer_list id_timeout;
Holger Hans Peter Freytheraa698242010-06-15 18:46:19 +080076
Holger Hans Peter Freyther906c15e2010-05-02 19:28:59 +080077 /* pong timeout */
78 struct timer_list ping_timeout;
79 struct timer_list pong_timeout;
80
Holger Hans Peter Freyther45fd07d2010-08-28 18:22:14 +080081 /* mgcp related code */
Holger Hans Peter Freyther85902a42010-09-01 09:31:46 +080082 int endpoint_status[32];
Holger Hans Peter Freyther45fd07d2010-08-28 18:22:14 +080083 int last_endpoint;
84
Holger Hans Peter Freytheraa698242010-06-15 18:46:19 +080085 /* a back pointer */
86 struct bsc_nat *nat;
Holger Hans Peter Freyther9f8f3d02010-02-07 13:08:09 +010087};
88
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +080089/**
Holger Hans Peter Freytherd4702862010-04-12 12:17:09 +020090 * Stats per BSC
91 */
92struct bsc_config_stats {
Holger Hans Peter Freytherb2c38eb2010-06-17 18:16:00 +080093 struct rate_ctr_group *ctrg;
94};
Holger Hans Peter Freytherd4702862010-04-12 12:17:09 +020095
Holger Hans Peter Freytherb2c38eb2010-06-17 18:16:00 +080096enum bsc_cfg_ctr {
97 BCFG_CTR_SCCP_CONN,
98 BCFG_CTR_SCCP_CALLS,
99 BCFG_CTR_NET_RECONN,
Holger Hans Peter Freyther8330c1c2010-06-17 18:29:42 +0800100 BCFG_CTR_DROPPED_SCCP,
101 BCFG_CTR_DROPPED_CALLS,
Holger Hans Peter Freytheree884962010-09-25 17:58:22 +0800102 BCFG_CTR_REJECTED_CR,
103 BCFG_CTR_REJECTED_MSG,
104 BCFG_CTR_ILL_PACKET,
Holger Hans Peter Freyther463dc622010-10-03 19:41:42 +0800105 BCFG_CTR_CON_TYPE_LU,
106 BCFG_CTR_CON_CMSERV_RQ,
107 BCFG_CTR_CON_PAG_RESP,
Holger Hans Peter Freyther74dc3032010-09-29 02:47:29 +0800108 BCFG_CTR_CON_SSA,
Holger Hans Peter Freyther463dc622010-10-03 19:41:42 +0800109 BCFG_CTR_CON_OTHER,
Holger Hans Peter Freytherd4702862010-04-12 12:17:09 +0200110};
111
112/**
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800113 * One BSC entry in the config
114 */
115struct bsc_config {
116 struct llist_head entry;
117
118 char *token;
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800119 int nr;
120
Holger Hans Peter Freytherb6061012010-05-14 22:06:28 +0800121 char *description;
122
Holger Hans Peter Freytherc16cf272010-04-13 09:24:37 +0200123 /* imsi white and blacklist */
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +0800124 char *acc_lst_name;
Holger Hans Peter Freytherc16cf272010-04-13 09:24:37 +0200125
Holger Hans Peter Freyther62e58432010-04-21 19:05:14 +0800126 int forbid_paging;
127
Holger Hans Peter Freytherc16cf272010-04-13 09:24:37 +0200128 /* backpointer */
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800129 struct bsc_nat *nat;
Holger Hans Peter Freytherd4702862010-04-12 12:17:09 +0200130
131 struct bsc_config_stats stats;
Holger Hans Peter Freyther0bd60f32010-10-08 22:08:29 +0800132
133 struct llist_head lac_list;
134};
135
136struct bsc_lac_entry {
137 struct llist_head entry;
138 uint16_t lac;
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800139};
140
141/**
Holger Hans Peter Freythera0df82d2010-04-01 08:21:33 +0200142 * BSCs point of view of endpoints
143 */
144struct bsc_endpoint {
Holger Hans Peter Freyther5b2726e2010-08-06 09:05:05 +0800145 /* the operation that is carried out */
146 int transaction_state;
Holger Hans Peter Freythera0df82d2010-04-01 08:21:33 +0200147 /* the pending transaction id */
148 char *transaction_id;
149 /* the bsc we are talking to */
150 struct bsc_connection *bsc;
151};
152
153/**
Holger Hans Peter Freytherd4702862010-04-12 12:17:09 +0200154 * Statistic for the nat.
155 */
156struct bsc_nat_statistics {
157 struct {
158 struct counter *conn;
159 struct counter *calls;
160 } sccp;
161
162 struct {
163 struct counter *reconn;
164 struct counter *auth_fail;
165 } bsc;
166
167 struct {
168 struct counter *reconn;
169 } msc;
Holger Hans Peter Freytherc16c2dc2010-10-13 20:22:36 +0200170
171 struct {
172 struct counter *reconn;
173 } ussd;
Holger Hans Peter Freytherd4702862010-04-12 12:17:09 +0200174};
175
Holger Hans Peter Freyther2f1a9842010-09-25 06:14:52 +0800176enum bsc_nat_acc_ctr {
177 ACC_LIST_BSC_FILTER,
178 ACC_LIST_NAT_FILTER,
179};
180
Holger Hans Peter Freyther29c67032010-06-08 10:14:44 +0800181struct bsc_nat_acc_lst {
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +0800182 struct llist_head list;
183
Holger Hans Peter Freyther2f1a9842010-09-25 06:14:52 +0800184 /* counter */
185 struct rate_ctr_group *stats;
186
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +0800187 /* the name of the list */
188 const char *name;
Holger Hans Peter Freytherd77c8172010-06-08 10:53:39 +0800189 struct llist_head fltr_list;
190};
191
192struct bsc_nat_acc_lst_entry {
193 struct llist_head list;
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +0800194
195 /* the filter */
196 char *imsi_allow;
197 regex_t imsi_allow_re;
198 char *imsi_deny;
199 regex_t imsi_deny_re;
200};
201
Holger Hans Peter Freytherd4702862010-04-12 12:17:09 +0200202/**
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800203 * the structure of the "nat" network
204 */
205struct bsc_nat {
206 /* active SCCP connections that need patching */
207 struct llist_head sccp_connections;
208
209 /* active BSC connections that need patching */
210 struct llist_head bsc_connections;
211
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +0800212 /* access lists */
213 struct llist_head access_lists;
214
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800215 /* known BSC's */
216 struct llist_head bsc_configs;
217 int num_bsc;
Holger Hans Peter Freyther6b771072010-07-27 19:21:53 +0800218 int bsc_ip_dscp;
Holger Hans Peter Freytherf7d33352010-06-15 18:50:26 +0800219
220 /* MGCP config */
221 struct mgcp_config *mgcp_cfg;
Holger Hans Peter Freytherdbd16fe2010-07-23 19:08:55 +0800222 uint8_t mgcp_msg[4096];
Holger Hans Peter Freyther8d200652010-04-04 18:09:10 +0200223 int mgcp_length;
Holger Hans Peter Freythera0df82d2010-04-01 08:21:33 +0200224
Holger Hans Peter Freytherb7527612010-04-07 11:20:36 +0200225 /* msc things */
Holger Hans Peter Freythera88742c2010-06-15 18:51:04 +0800226 char *msc_ip;
Holger Hans Peter Freyther81395532010-04-17 07:48:45 +0200227 int msc_port;
Holger Hans Peter Freytheraad82ce2010-05-11 19:07:39 +0800228 struct bsc_msc_connection *msc_con;
Holger Hans Peter Freythere635dab2010-05-15 00:14:58 +0800229 char *token;
Holger Hans Peter Freytherb7527612010-04-07 11:20:36 +0200230
Holger Hans Peter Freytherda35a8d2010-05-05 16:57:38 +0800231 /* timeouts */
232 int auth_timeout;
233 int ping_timeout;
234 int pong_timeout;
235
Holger Hans Peter Freythera0df82d2010-04-01 08:21:33 +0200236 struct bsc_endpoint *bsc_endpoints;
Holger Hans Peter Freytherd4702862010-04-12 12:17:09 +0200237
Holger Hans Peter Freytherc16cf272010-04-13 09:24:37 +0200238 /* filter */
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +0800239 char *acc_lst_name;
Holger Hans Peter Freytherc16cf272010-04-13 09:24:37 +0200240
Holger Hans Peter Freyther76424392010-10-21 10:59:54 +0200241 /* number rewriting */
242 char *num_rewr_name;
243 struct msg_entries *num_rewr;
244
Holger Hans Peter Freytherd1effd82010-10-10 17:29:20 +0200245 /* USSD messages we want to match */
246 char *ussd_lst_name;
Holger Hans Peter Freytherc1578bc2010-10-11 10:06:39 +0200247 char *ussd_query;
Holger Hans Peter Freythere393f272010-10-12 18:25:52 +0200248 char *ussd_token;
249 char *ussd_local;
Holger Hans Peter Freytherc16c2dc2010-10-13 20:22:36 +0200250 struct bsc_fd ussd_listen;
251 struct bsc_nat_ussd_con *ussd_con;
Holger Hans Peter Freytherd1effd82010-10-10 17:29:20 +0200252
Holger Hans Peter Freytherd4702862010-04-12 12:17:09 +0200253 /* statistics */
254 struct bsc_nat_statistics stats;
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800255};
256
257/* create and init the structures */
Holger Hans Peter Freyther0bd60f32010-10-08 22:08:29 +0800258struct bsc_config *bsc_config_alloc(struct bsc_nat *nat, const char *token);
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800259struct bsc_config *bsc_config_num(struct bsc_nat *nat, int num);
Holger Hans Peter Freyther0bd60f32010-10-08 22:08:29 +0800260void bsc_config_add_lac(struct bsc_config *cfg, int lac);
261void bsc_config_del_lac(struct bsc_config *cfg, int lac);
262int bsc_config_handles_lac(struct bsc_config *cfg, int lac);
263
Holger Hans Peter Freytherdcf8a7d2010-06-15 18:48:01 +0800264struct bsc_nat *bsc_nat_alloc(void);
265struct bsc_connection *bsc_connection_alloc(struct bsc_nat *nat);
Holger Hans Peter Freythera88742c2010-06-15 18:51:04 +0800266void bsc_nat_set_msc_ip(struct bsc_nat *bsc, const char *ip);
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800267
Holger Hans Peter Freyther23fe7be2010-03-30 10:45:48 +0200268void sccp_connection_destroy(struct sccp_connections *);
Holger Hans Peter Freyther2f9dcf02010-04-27 13:21:39 +0800269void bsc_close_connection(struct bsc_connection *);
Holger Hans Peter Freyther9f8f3d02010-02-07 13:08:09 +0100270
Holger Hans Peter Freyther234d3122010-05-16 02:06:11 +0800271const char *bsc_con_type_to_string(int type);
272
Holger Hans Peter Freyther0b8f69d2010-06-15 18:45:38 +0800273/**
274 * parse the given message into the above structure
275 */
276struct bsc_nat_parsed *bsc_nat_parse(struct msgb *msg);
277
Holger Hans Peter Freyther6a97b8d2010-06-15 18:45:26 +0800278/**
279 * filter based on IP Access header in both directions
280 */
Holger Hans Peter Freyther1d6fb182010-01-30 11:53:30 +0100281int bsc_nat_filter_ipa(int direction, struct msgb *msg, struct bsc_nat_parsed *parsed);
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800282int bsc_nat_vty_init(struct bsc_nat *nat);
Holger Hans Peter Freyther979a3092010-04-17 08:07:19 +0200283struct bsc_connection *bsc_nat_find_bsc(struct bsc_nat *nat, struct msgb *msg, int *_lac);
Holger Hans Peter Freyther6a97b8d2010-06-15 18:45:26 +0800284
Holger Hans Peter Freyther0ab6bab2010-06-15 18:47:49 +0800285/**
Holger Hans Peter Freytherb4af5c92010-05-14 03:39:56 +0800286 * Content filtering.
287 */
Holger Hans Peter Freyther19c0a842010-05-16 02:00:40 +0800288int bsc_nat_filter_sccp_cr(struct bsc_connection *bsc, struct msgb *msg,
Holger Hans Peter Freyther749497e2010-09-29 01:19:42 +0800289 struct bsc_nat_parsed *, int *con_type, char **imsi);
Holger Hans Peter Freyther74e0a1b2010-09-15 01:11:08 +0800290int bsc_nat_filter_dt(struct bsc_connection *bsc, struct msgb *msg,
291 struct sccp_connections *con, struct bsc_nat_parsed *parsed);
Holger Hans Peter Freytherb4af5c92010-05-14 03:39:56 +0800292
293/**
Holger Hans Peter Freyther0ab6bab2010-06-15 18:47:49 +0800294 * SCCP patching and handling
295 */
Holger Hans Peter Freytherfa20c942010-05-16 16:51:31 +0800296struct sccp_connections *create_sccp_src_ref(struct bsc_connection *bsc, struct bsc_nat_parsed *parsed);
Holger Hans Peter Freyther49c7fb52010-06-15 18:48:55 +0800297int update_sccp_src_ref(struct sccp_connections *sccp, struct bsc_nat_parsed *parsed);
Holger Hans Peter Freyther0ab6bab2010-06-15 18:47:49 +0800298void 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 +0800299struct 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 +0800300struct 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 +0200301struct sccp_connections *bsc_nat_find_con_by_bsc(struct bsc_nat *, struct sccp_source_reference *);
Holger Hans Peter Freyther0ab6bab2010-06-15 18:47:49 +0800302
Holger Hans Peter Freyther465313e2010-06-15 18:49:53 +0800303/**
304 * MGCP/Audio handling
305 */
Holger Hans Peter Freytherdbd16fe2010-07-23 19:08:55 +0800306int bsc_write_mgcp(struct bsc_connection *bsc, const uint8_t *data, unsigned int length);
Holger Hans Peter Freyther45fd07d2010-08-28 18:22:14 +0800307int bsc_mgcp_assign_patch(struct sccp_connections *, struct msgb *msg);
Holger Hans Peter Freyther7b7eef62010-04-22 12:08:17 +0800308void bsc_mgcp_init(struct sccp_connections *);
309void bsc_mgcp_dlcx(struct sccp_connections *);
Holger Hans Peter Freyther241e1302010-03-31 09:16:56 +0200310void bsc_mgcp_free_endpoints(struct bsc_nat *nat);
Holger Hans Peter Freyther7b7eef62010-04-22 12:08:17 +0800311int bsc_mgcp_nat_init(struct bsc_nat *nat);
Holger Hans Peter Freyther465313e2010-06-15 18:49:53 +0800312
Holger Hans Peter Freyther08a1b162010-04-18 02:26:16 +0800313struct sccp_connections *bsc_mgcp_find_con(struct bsc_nat *, int endpoint_number);
Holger Hans Peter Freytherf7c86c52010-08-30 13:44:32 +0800314struct msgb *bsc_mgcp_rewrite(char *input, int length, int endp, const char *ip, int port);
Holger Hans Peter Freyther3c3bce12010-04-01 10:16:28 +0200315void bsc_mgcp_forward(struct bsc_connection *bsc, struct msgb *msg);
316
Holger Hans Peter Freyther26a43892010-04-05 23:09:27 +0200317void bsc_mgcp_clear_endpoints_for(struct bsc_connection *bsc);
Holger Hans Peter Freyther3c3bce12010-04-01 10:16:28 +0200318int bsc_mgcp_parse_response(const char *str, int *code, char transaction[60]);
Holger Hans Peter Freyther46340132010-08-06 08:26:54 +0800319uint32_t bsc_mgcp_extract_ci(const char *resp);
Holger Hans Peter Freytherfc9bd232010-04-01 03:55:27 +0200320
Holger Hans Peter Freyther2896df72010-04-08 10:24:57 +0200321
322int bsc_write(struct bsc_connection *bsc, struct msgb *msg, int id);
Holger Hans Peter Freyther4d44fc52010-10-13 17:56:22 +0200323int bsc_do_write(struct write_queue *queue, struct msgb *msg, int id);
Holger Hans Peter Freyther7e8da132010-10-16 17:33:46 +0200324int bsc_write_msg(struct write_queue *queue, struct msgb *msg);
Holger Hans Peter Freyther69cfa172010-10-13 20:37:13 +0200325int bsc_write_cb(struct bsc_fd *bfd, struct msgb *msg);
Holger Hans Peter Freyther2896df72010-04-08 10:24:57 +0200326
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +0800327/* IMSI allow/deny handling */
Holger Hans Peter Freyther12dc89a2010-05-14 18:38:29 +0800328void bsc_parse_reg(void *ctx, regex_t *reg, char **imsi, int argc, const char **argv);
Holger Hans Peter Freyther29c67032010-06-08 10:14:44 +0800329struct bsc_nat_acc_lst *bsc_nat_acc_lst_find(struct bsc_nat *nat, const char *name);
330struct bsc_nat_acc_lst *bsc_nat_acc_lst_get(struct bsc_nat *nat, const char *name);
331void bsc_nat_acc_lst_delete(struct bsc_nat_acc_lst *lst);
Holger Hans Peter Freyther12dc89a2010-05-14 18:38:29 +0800332
Holger Hans Peter Freytherd77c8172010-06-08 10:53:39 +0800333struct 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 +0200334int bsc_nat_lst_check_allow(struct bsc_nat_acc_lst *lst, const char *imsi);
Holger Hans Peter Freytherd77c8172010-06-08 10:53:39 +0800335
Holger Hans Peter Freyther20ee3122010-07-05 14:39:44 +0800336int bsc_nat_msc_is_connected(struct bsc_nat *nat);
337
Holger Hans Peter Freyther463dc622010-10-03 19:41:42 +0800338int bsc_conn_type_to_ctr(struct sccp_connections *conn);
339
Holger Hans Peter Freythera3967572010-09-29 02:30:50 +0800340struct gsm48_hdr *bsc_unpack_dtap(struct bsc_nat_parsed *parsed, struct msgb *msg, uint32_t *len);
341
Holger Hans Peter Freyther17870cf2010-09-29 19:32:55 +0800342/** USSD filtering */
Holger Hans Peter Freytherc16c2dc2010-10-13 20:22:36 +0200343int bsc_ussd_init(struct bsc_nat *nat);
Holger Hans Peter Freyther17870cf2010-09-29 19:32:55 +0800344int bsc_check_ussd(struct sccp_connections *con, struct bsc_nat_parsed *parsed, struct msgb *msg);
345
Holger Hans Peter Freyther6a97b8d2010-06-15 18:45:26 +0800346#endif