blob: a24e9de8b42581e69c759f155b7aa13cceeb824b [file] [log] [blame]
Holger Hans Peter Freytheradc2e872012-12-17 13:32:53 +01001/*
2 * Access filtering
3 */
4/*
Holger Hans Peter Freyther973dbae2015-04-04 20:47:03 +02005 * (C) 2010-2015 by Holger Hans Peter Freyther <zecke@selfish.org>
Holger Hans Peter Freytherbdf764a2012-12-17 14:35:03 +01006 * (C) 2010-2012 by On-Waves
Holger Hans Peter Freytheradc2e872012-12-17 13:32:53 +01007 * All Rights Reserved
8 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU Affero General Public License as published by
11 * the Free Software Foundation; either version 3 of the License, or
12 * (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU Affero General Public License for more details.
18 *
19 * You should have received a copy of the GNU Affero General Public License
20 * along with this program. If not, see <http://www.gnu.org/licenses/>.
21 *
22 */
23
Holger Hans Peter Freyther973dbae2015-04-04 20:47:03 +020024#include <openbsc/bsc_msg_filter.h>
25
Holger Hans Peter Freytheradc2e872012-12-17 13:32:53 +010026#include <openbsc/bsc_nat.h>
27#include <openbsc/bsc_nat_sccp.h>
28#include <openbsc/bsc_msc.h>
29#include <openbsc/gsm_data.h>
30#include <openbsc/debug.h>
31#include <openbsc/ipaccess.h>
32
Holger Hans Peter Freytheradc2e872012-12-17 13:32:53 +010033#include <osmocom/core/talloc.h>
34#include <osmocom/gsm/gsm0808.h>
35
36#include <osmocom/gsm/protocol/gsm_08_08.h>
37#include <osmocom/gsm/protocol/gsm_04_11.h>
38
39#include <osmocom/sccp/sccp.h>
40
Holger Hans Peter Freyther71857d72015-04-05 18:48:27 +020041struct filter_request {
42 struct rb_root *black_list;
43 struct llist_head *access_lists;
44 const char *local_lst_name;
45 const char *global_lst_name;
46 int bsc_nr;
47};
48
Holger Hans Peter Freytherc36a6d52015-04-05 16:55:28 +020049int bsc_filter_barr_find(struct rb_root *root, const char *imsi, int *cm, int *lu)
Holger Hans Peter Freyther1f8276e2013-01-01 11:25:09 +010050{
Holger Hans Peter Freytherc36a6d52015-04-05 16:55:28 +020051 struct bsc_filter_barr_entry *n;
52 n = rb_entry(root->rb_node, struct bsc_filter_barr_entry, node);
Holger Hans Peter Freyther1f8276e2013-01-01 11:25:09 +010053
54 while (n) {
55 int rc = strcmp(imsi, n->imsi);
56 if (rc == 0) {
57 *cm = n->cm_reject_cause;
58 *lu = n->lu_reject_cause;
59 return 1;
60 }
61
62 n = rb_entry(
63 (rc < 0) ? n->node.rb_left : n->node.rb_right,
Holger Hans Peter Freytherc36a6d52015-04-05 16:55:28 +020064 struct bsc_filter_barr_entry, node);
Holger Hans Peter Freyther1f8276e2013-01-01 11:25:09 +010065 };
66
67 return 0;
68}
69
Holger Hans Peter Freytherc36a6d52015-04-05 16:55:28 +020070static int insert_barr_node(struct bsc_filter_barr_entry *entry, struct rb_root *root)
Holger Hans Peter Freyther1f8276e2013-01-01 11:25:09 +010071{
72 struct rb_node **new = &root->rb_node, *parent = NULL;
73
74 while (*new) {
75 int rc;
Holger Hans Peter Freytherc36a6d52015-04-05 16:55:28 +020076 struct bsc_filter_barr_entry *this;
77 this = rb_entry(*new, struct bsc_filter_barr_entry, node);
Holger Hans Peter Freyther1f8276e2013-01-01 11:25:09 +010078 parent = *new;
79
80 rc = strcmp(entry->imsi, this->imsi);
81 if (rc < 0)
82 new = &((*new)->rb_left);
83 else if (rc > 0)
84 new = &((*new)->rb_right);
85 else {
86 LOGP(DNAT, LOGL_ERROR,
87 "Duplicate entry for IMSI(%s)\n", entry->imsi);
88 talloc_free(entry);
89 return -1;
90 }
91 }
92
93 rb_link_node(&entry->node, parent, new);
94 rb_insert_color(&entry->node, root);
95 return 0;
96}
97
Holger Hans Peter Freytherc36a6d52015-04-05 16:55:28 +020098int bsc_filter_barr_adapt(void *ctx, struct rb_root *root,
Holger Hans Peter Freyther1f8276e2013-01-01 11:25:09 +010099 const struct osmo_config_list *list)
100{
101 struct osmo_config_entry *cfg_entry;
102 int err = 0;
103
104 /* free the old data */
105 while (!RB_EMPTY_ROOT(root)) {
106 struct rb_node *node = rb_first(root);
107 rb_erase(node, root);
108 talloc_free(node);
109 }
110
111 if (!list)
112 return 0;
113
114 /* now adapt the new list */
115 llist_for_each_entry(cfg_entry, &list->entry, list) {
Holger Hans Peter Freytherc36a6d52015-04-05 16:55:28 +0200116 struct bsc_filter_barr_entry *entry;
117 entry = talloc_zero(ctx, struct bsc_filter_barr_entry);
Holger Hans Peter Freyther1f8276e2013-01-01 11:25:09 +0100118 if (!entry) {
119 LOGP(DNAT, LOGL_ERROR,
120 "Allocation of the barr entry failed.\n");
121 continue;
122 }
123
124 entry->imsi = talloc_strdup(entry, cfg_entry->mcc);
125 entry->cm_reject_cause = atoi(cfg_entry->mnc);
126 entry->lu_reject_cause = atoi(cfg_entry->option);
127 err |= insert_barr_node(entry, root);
128 }
129
130 return err;
131}
132
133
Holger Hans Peter Freythera1e6bd62015-04-04 22:40:12 +0200134static int lst_check_deny(struct bsc_msg_acc_lst *lst, const char *mi_string,
Holger Hans Peter Freyther415cd2e2014-01-20 09:55:46 +0100135 int *cm_cause, int *lu_cause)
Holger Hans Peter Freytheradc2e872012-12-17 13:32:53 +0100136{
Holger Hans Peter Freythera1e6bd62015-04-04 22:40:12 +0200137 struct bsc_msg_acc_lst_entry *entry;
Holger Hans Peter Freytheradc2e872012-12-17 13:32:53 +0100138
139 llist_for_each_entry(entry, &lst->fltr_list, list) {
140 if (!entry->imsi_deny)
141 continue;
Holger Hans Peter Freyther415cd2e2014-01-20 09:55:46 +0100142 if (regexec(&entry->imsi_deny_re, mi_string, 0, NULL, 0) == 0) {
143 *cm_cause = entry->cm_reject_cause;
144 *lu_cause = entry->lu_reject_cause;
Holger Hans Peter Freytheradc2e872012-12-17 13:32:53 +0100145 return 0;
Holger Hans Peter Freyther415cd2e2014-01-20 09:55:46 +0100146 }
Holger Hans Peter Freytheradc2e872012-12-17 13:32:53 +0100147 }
148
149 return 1;
150}
151
152/* apply white/black list */
Holger Hans Peter Freyther71857d72015-04-05 18:48:27 +0200153static int auth_imsi(struct filter_request *req,
154 const char *imsi,
Holger Hans Peter Freytherc36a6d52015-04-05 16:55:28 +0200155 struct bsc_filter_reject_cause *cause)
Holger Hans Peter Freytheradc2e872012-12-17 13:32:53 +0100156{
157 /*
158 * Now apply blacklist/whitelist of the BSC and the NAT.
Holger Hans Peter Freyther1f8276e2013-01-01 11:25:09 +0100159 * 1.) Check the global IMSI barr list
160 * 2.) Allow directly if the IMSI is allowed at the BSC
161 * 3.) Reject if the IMSI is not allowed at the BSC
162 * 4.) Reject if the IMSI not allowed at the global level.
163 * 5.) Allow directly if the IMSI is allowed at the global level
Holger Hans Peter Freytheradc2e872012-12-17 13:32:53 +0100164 */
Holger Hans Peter Freyther1f8276e2013-01-01 11:25:09 +0100165 int cm, lu;
Holger Hans Peter Freythera1e6bd62015-04-04 22:40:12 +0200166 struct bsc_msg_acc_lst *nat_lst = NULL;
167 struct bsc_msg_acc_lst *bsc_lst = NULL;
Holger Hans Peter Freytheradc2e872012-12-17 13:32:53 +0100168
Holger Hans Peter Freyther1f8276e2013-01-01 11:25:09 +0100169 /* 1. global check for barred imsis */
Holger Hans Peter Freyther71857d72015-04-05 18:48:27 +0200170 if (bsc_filter_barr_find(req->black_list, imsi, &cm, &lu)) {
Holger Hans Peter Freyther1f8276e2013-01-01 11:25:09 +0100171 cause->cm_reject_cause = cm;
172 cause->lu_reject_cause = lu;
173 LOGP(DNAT, LOGL_DEBUG,
174 "Blocking subscriber IMSI %s with CM: %d LU: %d\n",
175 imsi, cm, lu);
Holger Hans Peter Freytherfa1cba92015-04-05 11:44:47 +0200176 return -4;
Holger Hans Peter Freyther1f8276e2013-01-01 11:25:09 +0100177 }
178
179
Holger Hans Peter Freyther71857d72015-04-05 18:48:27 +0200180 bsc_lst = bsc_msg_acc_lst_find(req->access_lists, req->local_lst_name);
181 nat_lst = bsc_msg_acc_lst_find(req->access_lists, req->global_lst_name);
Holger Hans Peter Freytheradc2e872012-12-17 13:32:53 +0100182
183
184 if (bsc_lst) {
Holger Hans Peter Freyther1f8276e2013-01-01 11:25:09 +0100185 /* 2. BSC allow */
Holger Hans Peter Freythera1e6bd62015-04-04 22:40:12 +0200186 if (bsc_msg_acc_lst_check_allow(bsc_lst, imsi) == 0)
Holger Hans Peter Freytheradc2e872012-12-17 13:32:53 +0100187 return 1;
188
Holger Hans Peter Freyther1f8276e2013-01-01 11:25:09 +0100189 /* 3. BSC deny */
Holger Hans Peter Freyther415cd2e2014-01-20 09:55:46 +0100190 if (lst_check_deny(bsc_lst, imsi, &cm, &lu) == 0) {
Holger Hans Peter Freytheradc2e872012-12-17 13:32:53 +0100191 LOGP(DNAT, LOGL_ERROR,
Holger Hans Peter Freyther71857d72015-04-05 18:48:27 +0200192 "Filtering %s by imsi_deny on config nr: %d.\n", imsi, req->bsc_nr);
Holger Hans Peter Freyther14b2cd92015-04-05 16:50:34 +0200193 rate_ctr_inc(&bsc_lst->stats->ctr[ACC_LIST_LOCAL_FILTER]);
Holger Hans Peter Freyther415cd2e2014-01-20 09:55:46 +0100194 cause->cm_reject_cause = cm;
195 cause->lu_reject_cause = lu;
Holger Hans Peter Freytheradc2e872012-12-17 13:32:53 +0100196 return -2;
197 }
198
199 }
200
Holger Hans Peter Freyther1f8276e2013-01-01 11:25:09 +0100201 /* 4. NAT deny */
Holger Hans Peter Freytheradc2e872012-12-17 13:32:53 +0100202 if (nat_lst) {
Holger Hans Peter Freyther415cd2e2014-01-20 09:55:46 +0100203 if (lst_check_deny(nat_lst, imsi, &cm, &lu) == 0) {
Holger Hans Peter Freytheradc2e872012-12-17 13:32:53 +0100204 LOGP(DNAT, LOGL_ERROR,
Holger Hans Peter Freyther71857d72015-04-05 18:48:27 +0200205 "Filtering %s global imsi_deny on bsc nr: %d.\n", imsi, req->bsc_nr);
Holger Hans Peter Freyther14b2cd92015-04-05 16:50:34 +0200206 rate_ctr_inc(&nat_lst->stats->ctr[ACC_LIST_GLOBAL_FILTER]);
Holger Hans Peter Freyther415cd2e2014-01-20 09:55:46 +0100207 cause->cm_reject_cause = cm;
208 cause->lu_reject_cause = lu;
Holger Hans Peter Freytheradc2e872012-12-17 13:32:53 +0100209 return -3;
210 }
211 }
212
213 return 1;
214}
215
216static int _cr_check_loc_upd(struct bsc_connection *bsc,
217 uint8_t *data, unsigned int length,
Holger Hans Peter Freyther0434fae2012-12-17 15:22:47 +0100218 char **imsi)
Holger Hans Peter Freytheradc2e872012-12-17 13:32:53 +0100219{
220 uint8_t mi_type;
221 struct gsm48_loc_upd_req *lu;
222 char mi_string[GSM48_MI_SIZE];
223
224 if (length < sizeof(*lu)) {
225 LOGP(DNAT, LOGL_ERROR,
226 "LU does not fit. Length is %d \n", length);
227 return -1;
228 }
229
230 lu = (struct gsm48_loc_upd_req *) data;
231 mi_type = lu->mi[0] & GSM_MI_TYPE_MASK;
232
233 /*
234 * We can only deal with the IMSI. This will fail for a phone that
235 * will send the TMSI of a previous network to us.
236 */
237 if (mi_type != GSM_MI_TYPE_IMSI)
238 return 0;
239
240 gsm48_mi_to_string(mi_string, sizeof(mi_string), lu->mi, lu->mi_len);
241 *imsi = talloc_strdup(bsc, mi_string);
Holger Hans Peter Freyther0434fae2012-12-17 15:22:47 +0100242 return 1;
Holger Hans Peter Freytheradc2e872012-12-17 13:32:53 +0100243}
244
245static int _cr_check_cm_serv_req(struct bsc_connection *bsc,
246 uint8_t *data, unsigned int length,
Holger Hans Peter Freyther0434fae2012-12-17 15:22:47 +0100247 int *con_type, char **imsi)
Holger Hans Peter Freytheradc2e872012-12-17 13:32:53 +0100248{
249 static const uint32_t classmark_offset =
250 offsetof(struct gsm48_service_request, classmark);
251
252 char mi_string[GSM48_MI_SIZE];
253 uint8_t mi_type;
254 int rc;
255 struct gsm48_service_request *req;
256
257 /* unfortunately in Phase1 the classmark2 length is variable */
258
259 if (length < sizeof(*req)) {
260 LOGP(DNAT, LOGL_ERROR,
261 "CM Serv Req does not fit. Length is %d\n", length);
262 return -1;
263 }
264
265 req = (struct gsm48_service_request *) data;
266 if (req->cm_service_type == 0x8)
267 *con_type = NAT_CON_TYPE_SSA;
268 rc = gsm48_extract_mi((uint8_t *) &req->classmark,
269 length - classmark_offset, mi_string, &mi_type);
270 if (rc < 0) {
271 LOGP(DNAT, LOGL_ERROR, "Failed to parse the classmark2/mi. error: %d\n", rc);
272 return -1;
273 }
274
275 /* we have to let the TMSI or such pass */
276 if (mi_type != GSM_MI_TYPE_IMSI)
277 return 0;
278
279 *imsi = talloc_strdup(bsc, mi_string);
Holger Hans Peter Freyther0434fae2012-12-17 15:22:47 +0100280 return 1;
Holger Hans Peter Freytheradc2e872012-12-17 13:32:53 +0100281}
282
283static int _cr_check_pag_resp(struct bsc_connection *bsc,
Holger Hans Peter Freyther0434fae2012-12-17 15:22:47 +0100284 uint8_t *data, unsigned int length, char **imsi)
Holger Hans Peter Freytheradc2e872012-12-17 13:32:53 +0100285{
286 struct gsm48_pag_resp *resp;
287 char mi_string[GSM48_MI_SIZE];
288 uint8_t mi_type;
289
290 if (length < sizeof(*resp)) {
291 LOGP(DNAT, LOGL_ERROR, "PAG RESP does not fit. Length was %d.\n", length);
292 return -1;
293 }
294
295 resp = (struct gsm48_pag_resp *) data;
296 if (gsm48_paging_extract_mi(resp, length, mi_string, &mi_type) < 0) {
297 LOGP(DNAT, LOGL_ERROR, "Failed to extract the MI.\n");
298 return -1;
299 }
300
301 /* we need to let it pass for now */
302 if (mi_type != GSM_MI_TYPE_IMSI)
303 return 0;
304
305 *imsi = talloc_strdup(bsc, mi_string);
Holger Hans Peter Freyther0434fae2012-12-17 15:22:47 +0100306 return 1;
Holger Hans Peter Freytheradc2e872012-12-17 13:32:53 +0100307}
308
Holger Hans Peter Freyther71857d72015-04-05 18:48:27 +0200309static int _dt_check_id_resp(struct filter_request *req,
Holger Hans Peter Freytheradc2e872012-12-17 13:32:53 +0100310 uint8_t *data, unsigned int length,
Holger Hans Peter Freytherc279e392013-04-16 09:53:13 +0200311 struct nat_sccp_connection *con,
Holger Hans Peter Freytherc36a6d52015-04-05 16:55:28 +0200312 struct bsc_filter_reject_cause *cause)
Holger Hans Peter Freytheradc2e872012-12-17 13:32:53 +0100313{
314 char mi_string[GSM48_MI_SIZE];
315 uint8_t mi_type;
Holger Hans Peter Freytheradc2e872012-12-17 13:32:53 +0100316
317 if (length < 2) {
318 LOGP(DNAT, LOGL_ERROR, "mi does not fit.\n");
319 return -1;
320 }
321
322 if (data[0] < length - 1) {
323 LOGP(DNAT, LOGL_ERROR, "mi length too big.\n");
324 return -2;
325 }
326
327 mi_type = data[1] & GSM_MI_TYPE_MASK;
328 gsm48_mi_to_string(mi_string, sizeof(mi_string), &data[1], data[0]);
329
330 if (mi_type != GSM_MI_TYPE_IMSI)
331 return 0;
332
Holger Hans Peter Freytheradc2e872012-12-17 13:32:53 +0100333 con->imsi_checked = 1;
334 con->imsi = talloc_strdup(con, mi_string);
Holger Hans Peter Freyther71857d72015-04-05 18:48:27 +0200335 return auth_imsi(req, mi_string, cause);
Holger Hans Peter Freytheradc2e872012-12-17 13:32:53 +0100336}
337
338
339/* Filter out CR data... */
Holger Hans Peter Freyther4ba947b2015-04-05 18:07:45 +0200340int bsc_msg_filter_initial(struct gsm48_hdr *hdr48, size_t hdr48_len,
341 struct bsc_connection *bsc,
342 int *con_type,
Holger Hans Peter Freytherc36a6d52015-04-05 16:55:28 +0200343 char **imsi, struct bsc_filter_reject_cause *cause)
Holger Hans Peter Freytheradc2e872012-12-17 13:32:53 +0100344{
Holger Hans Peter Freyther71857d72015-04-05 18:48:27 +0200345 struct filter_request req;
Holger Hans Peter Freyther4ba947b2015-04-05 18:07:45 +0200346 int ret = 0;
Holger Hans Peter Freytheradc2e872012-12-17 13:32:53 +0100347 uint8_t msg_type, proto;
348
349 *con_type = NAT_CON_TYPE_NONE;
Holger Hans Peter Freytherbdf764a2012-12-17 14:35:03 +0100350 cause->cm_reject_cause = GSM48_REJECT_PLMN_NOT_ALLOWED;
351 cause->lu_reject_cause = GSM48_REJECT_PLMN_NOT_ALLOWED;
Holger Hans Peter Freytheradc2e872012-12-17 13:32:53 +0100352 *imsi = NULL;
353
Holger Hans Peter Freytheradc2e872012-12-17 13:32:53 +0100354 proto = hdr48->proto_discr & 0x0f;
355 msg_type = hdr48->msg_type & 0xbf;
356 if (proto == GSM48_PDISC_MM &&
357 msg_type == GSM48_MT_MM_LOC_UPD_REQUEST) {
358 *con_type = NAT_CON_TYPE_LU;
Holger Hans Peter Freyther0434fae2012-12-17 15:22:47 +0100359 ret = _cr_check_loc_upd(bsc, &hdr48->data[0],
360 hdr48_len - sizeof(*hdr48), imsi);
Holger Hans Peter Freytheradc2e872012-12-17 13:32:53 +0100361 } else if (proto == GSM48_PDISC_MM &&
362 msg_type == GSM48_MT_MM_CM_SERV_REQ) {
363 *con_type = NAT_CON_TYPE_CM_SERV_REQ;
Holger Hans Peter Freyther0434fae2012-12-17 15:22:47 +0100364 ret = _cr_check_cm_serv_req(bsc, &hdr48->data[0],
Holger Hans Peter Freytheradc2e872012-12-17 13:32:53 +0100365 hdr48_len - sizeof(*hdr48),
Holger Hans Peter Freyther0434fae2012-12-17 15:22:47 +0100366 con_type, imsi);
Holger Hans Peter Freytheradc2e872012-12-17 13:32:53 +0100367 } else if (proto == GSM48_PDISC_RR &&
368 msg_type == GSM48_MT_RR_PAG_RESP) {
369 *con_type = NAT_CON_TYPE_PAG_RESP;
Holger Hans Peter Freyther0434fae2012-12-17 15:22:47 +0100370 ret = _cr_check_pag_resp(bsc, &hdr48->data[0],
371 hdr48_len - sizeof(*hdr48), imsi);
Holger Hans Peter Freytheradc2e872012-12-17 13:32:53 +0100372 } else {
373 /* We only want to filter the above, let other things pass */
374 *con_type = NAT_CON_TYPE_OTHER;
375 return 0;
376 }
Holger Hans Peter Freyther0434fae2012-12-17 15:22:47 +0100377
378 /* check if we are done */
379 if (ret != 1)
380 return ret;
381
382 /* the memory allocation failed */
383 if (!*imsi)
384 return -1;
385
386 /* now check the imsi */
Holger Hans Peter Freyther71857d72015-04-05 18:48:27 +0200387 req.black_list = &bsc->nat->imsi_black_list;
388 req.access_lists = &bsc->nat->access_lists;
389 req.local_lst_name = bsc->cfg->acc_lst_name;
390 req.global_lst_name = bsc->nat->acc_lst_name;
391 req.bsc_nr = bsc->cfg->nr;
392 return auth_imsi(&req, *imsi, cause);
Holger Hans Peter Freytheradc2e872012-12-17 13:32:53 +0100393}
394
Holger Hans Peter Freyther4ba947b2015-04-05 18:07:45 +0200395int bsc_msg_filter_data(struct gsm48_hdr *hdr48, size_t len,
396 struct bsc_connection *bsc,
397 struct nat_sccp_connection *con,
Holger Hans Peter Freytherc36a6d52015-04-05 16:55:28 +0200398 struct bsc_filter_reject_cause *cause)
Holger Hans Peter Freytheradc2e872012-12-17 13:32:53 +0100399{
Holger Hans Peter Freyther71857d72015-04-05 18:48:27 +0200400 struct filter_request req;
Holger Hans Peter Freytheradc2e872012-12-17 13:32:53 +0100401 uint8_t msg_type, proto;
Holger Hans Peter Freytheradc2e872012-12-17 13:32:53 +0100402
Holger Hans Peter Freytherbdf764a2012-12-17 14:35:03 +0100403 cause->cm_reject_cause = GSM48_REJECT_PLMN_NOT_ALLOWED;
404 cause->lu_reject_cause = GSM48_REJECT_PLMN_NOT_ALLOWED;
405
Holger Hans Peter Freytheradc2e872012-12-17 13:32:53 +0100406 if (con->imsi_checked)
407 return 0;
408
Holger Hans Peter Freytheradc2e872012-12-17 13:32:53 +0100409 proto = hdr48->proto_discr & 0x0f;
410 msg_type = hdr48->msg_type & 0xbf;
Holger Hans Peter Freyther0434fae2012-12-17 15:22:47 +0100411 if (proto != GSM48_PDISC_MM || msg_type != GSM48_MT_MM_ID_RESP)
Holger Hans Peter Freytheradc2e872012-12-17 13:32:53 +0100412 return 0;
Holger Hans Peter Freyther0434fae2012-12-17 15:22:47 +0100413
Holger Hans Peter Freyther71857d72015-04-05 18:48:27 +0200414 req.black_list = &bsc->nat->imsi_black_list;
415 req.access_lists = &bsc->nat->access_lists;
416 req.local_lst_name = bsc->cfg->acc_lst_name;
417 req.global_lst_name = bsc->nat->acc_lst_name;
418 req.bsc_nr = bsc->cfg->nr;
419 return _dt_check_id_resp(&req, &hdr48->data[0],
Holger Hans Peter Freyther0434fae2012-12-17 15:22:47 +0100420 len - sizeof(*hdr48), con, cause);
Holger Hans Peter Freytheradc2e872012-12-17 13:32:53 +0100421}