blob: bed5b807965f78dd22c6317b20c9bb86db60a97e [file] [log] [blame]
Holger Hans Peter Freyther0b8f69d2010-06-15 18:45:38 +08001/*
2 * BSC NAT Message filtering
3 *
Holger Hans Peter Freytherdbd94492013-04-02 12:34:11 +02004 * (C) 2010-2013 by Holger Hans Peter Freyther <zecke@selfish.org>
5 * (C) 2010-2013 by On-Waves
Holger Hans Peter Freyther0b8f69d2010-06-15 18:45:38 +08006 *
7 * All Rights Reserved
8 *
9 * This program is free software; you can redistribute it and/or modify
Harald Welte9af6ddf2011-01-01 15:25:50 +010010 * 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
Holger Hans Peter Freyther0b8f69d2010-06-15 18:45:38 +080012 * (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 General Public License for more details.
18 *
Harald Welte9af6ddf2011-01-01 15:25:50 +010019 * 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/>.
Holger Hans Peter Freyther0b8f69d2010-06-15 18:45:38 +080021 *
22 */
23
24
25#include <openbsc/debug.h>
26#include <openbsc/gsm_data.h>
27#include <openbsc/bsc_nat.h>
Holger Hans Peter Freytherc2b31ed2010-07-31 05:17:17 +080028#include <openbsc/bsc_nat_sccp.h>
Holger Hans Peter Freytherddf191e2013-06-25 11:44:01 +020029#include <openbsc/nat_rewrite_trie.h>
Holger Hans Peter Freyther0b8f69d2010-06-15 18:45:38 +080030
Holger Hans Peter Freyther67cd75f2011-05-12 16:02:07 +020031#include <osmocom/core/application.h>
Holger Hans Peter Freytherb2b291d2013-04-16 13:23:43 +020032#include <osmocom/core/backtrace.h>
Pablo Neira Ayuso928cb332011-03-26 22:08:53 +010033#include <osmocom/core/talloc.h>
Holger Hans Peter Freyther38f7c752010-06-15 18:48:36 +080034
Harald Welted5db12c2010-08-03 15:11:51 +020035#include <osmocom/sccp/sccp.h>
Pablo Neira Ayuso928cb332011-03-26 22:08:53 +010036#include <osmocom/gsm/protocol/gsm_08_08.h>
Holger Hans Peter Freyther30e1ae92010-07-30 02:53:14 +080037
Holger Hans Peter Freyther0b8f69d2010-06-15 18:45:38 +080038#include <stdio.h>
39
40/* test messages for ipa */
Holger Hans Peter Freytherdbd16fe2010-07-23 19:08:55 +080041static uint8_t ipa_id[] = {
Holger Hans Peter Freyther0b8f69d2010-06-15 18:45:38 +080042 0x00, 0x01, 0xfe, 0x06,
43};
44
45/* SCCP messages are below */
Holger Hans Peter Freytherdbd16fe2010-07-23 19:08:55 +080046static uint8_t gsm_reset[] = {
Holger Hans Peter Freyther0b8f69d2010-06-15 18:45:38 +080047 0x00, 0x12, 0xfd,
48 0x09, 0x00, 0x03, 0x05, 0x07, 0x02, 0x42, 0xfe,
49 0x02, 0x42, 0xfe, 0x06, 0x00, 0x04, 0x30, 0x04,
50 0x01, 0x20,
51};
52
Holger Hans Peter Freytherdbd16fe2010-07-23 19:08:55 +080053static const uint8_t gsm_reset_ack[] = {
Holger Hans Peter Freyther0b8f69d2010-06-15 18:45:38 +080054 0x00, 0x13, 0xfd,
55 0x09, 0x00, 0x03, 0x07, 0x0b, 0x04, 0x43, 0x01,
56 0x00, 0xfe, 0x04, 0x43, 0x5c, 0x00, 0xfe, 0x03,
57 0x00, 0x01, 0x31,
58};
59
Holger Hans Peter Freytherdbd16fe2010-07-23 19:08:55 +080060static const uint8_t gsm_paging[] = {
Holger Hans Peter Freyther0b8f69d2010-06-15 18:45:38 +080061 0x00, 0x20, 0xfd,
62 0x09, 0x00, 0x03, 0x07, 0x0b, 0x04, 0x43, 0x01,
63 0x00, 0xfe, 0x04, 0x43, 0x5c, 0x00, 0xfe, 0x10,
64 0x00, 0x0e, 0x52, 0x08, 0x08, 0x29, 0x47, 0x10,
65 0x02, 0x01, 0x31, 0x97, 0x61, 0x1a, 0x01, 0x06,
66};
67
68/* BSC -> MSC connection open */
Holger Hans Peter Freytherdbd16fe2010-07-23 19:08:55 +080069static const uint8_t bssmap_cr[] = {
Holger Hans Peter Freyther0b8f69d2010-06-15 18:45:38 +080070 0x00, 0x2c, 0xfd,
71 0x01, 0x01, 0x02, 0x03, 0x02, 0x02, 0x04, 0x02,
72 0x42, 0xfe, 0x0f, 0x1f, 0x00, 0x1d, 0x57, 0x05,
73 0x08, 0x00, 0x72, 0xf4, 0x80, 0x20, 0x12, 0xc3,
74 0x50, 0x17, 0x10, 0x05, 0x24, 0x11, 0x03, 0x33,
75 0x19, 0xa2, 0x08, 0x29, 0x47, 0x10, 0x02, 0x01,
76 0x31, 0x97, 0x61, 0x00
77};
78
79/* MSC -> BSC connection confirm */
Holger Hans Peter Freytherdbd16fe2010-07-23 19:08:55 +080080static const uint8_t bssmap_cc[] = {
Holger Hans Peter Freyther0b8f69d2010-06-15 18:45:38 +080081 0x00, 0x0a, 0xfd,
82 0x02, 0x01, 0x02, 0x03, 0x00, 0x00, 0x03, 0x02, 0x01, 0x00,
83};
84
85/* MSC -> BSC released */
Holger Hans Peter Freytherdbd16fe2010-07-23 19:08:55 +080086static const uint8_t bssmap_released[] = {
Holger Hans Peter Freyther0b8f69d2010-06-15 18:45:38 +080087 0x00, 0x0e, 0xfd,
88 0x04, 0x00, 0x00, 0x03, 0x01, 0x02, 0x03, 0x00, 0x01, 0x0f,
89 0x02, 0x23, 0x42, 0x00,
90};
91
92/* BSC -> MSC released */
Holger Hans Peter Freytherdbd16fe2010-07-23 19:08:55 +080093static const uint8_t bssmap_release_complete[] = {
Holger Hans Peter Freyther0b8f69d2010-06-15 18:45:38 +080094 0x00, 0x07, 0xfd,
95 0x05, 0x01, 0x02, 0x03, 0x00, 0x00, 0x03
96};
97
Holger Hans Peter Freyther0a6f62f2010-04-06 10:22:01 +020098/* both directions IT timer */
Holger Hans Peter Freytherdbd16fe2010-07-23 19:08:55 +080099static const uint8_t connnection_it[] = {
Holger Hans Peter Freyther0a6f62f2010-04-06 10:22:01 +0200100 0x00, 0x0b, 0xfd,
101 0x10, 0x01, 0x02, 0x03, 0x01, 0x02, 0x03,
102 0x00, 0x00, 0x00, 0x00,
103};
104
Holger Hans Peter Freyther5e63f922010-04-21 15:45:26 +0800105/* error in both directions */
Holger Hans Peter Freytherdbd16fe2010-07-23 19:08:55 +0800106static const uint8_t proto_error[] = {
Holger Hans Peter Freyther5e63f922010-04-21 15:45:26 +0800107 0x00, 0x05, 0xfd,
108 0x0f, 0x22, 0x33, 0x44, 0x00,
109};
110
Holger Hans Peter Freythera128d912010-04-01 08:47:12 +0200111/* MGCP wrap... */
Holger Hans Peter Freytherdbd16fe2010-07-23 19:08:55 +0800112static const uint8_t mgcp_msg[] = {
Holger Hans Peter Freythera128d912010-04-01 08:47:12 +0200113 0x00, 0x03, 0xfc,
114 0x20, 0x20, 0x20,
115};
116
Holger Hans Peter Freyther34a96ae2010-05-14 19:49:35 +0800117/* location updating request */
Holger Hans Peter Freytherdbd16fe2010-07-23 19:08:55 +0800118static const uint8_t bss_lu[] = {
Holger Hans Peter Freyther34a96ae2010-05-14 19:49:35 +0800119 0x00, 0x2e, 0xfd,
120 0x01, 0x91, 0x45, 0x14, 0x02, 0x02, 0x04, 0x02,
121 0x42, 0xfe, 0x0f, 0x21, 0x00, 0x1f, 0x57, 0x05,
122 0x08, 0x00, 0x72, 0xf4, 0x80, 0x20, 0x14, 0xc3,
123 0x50, 0x17, 0x12, 0x05, 0x08, 0x70, 0x72, 0xf4,
124 0x80, 0xff, 0xfe, 0x30, 0x08, 0x29, 0x44, 0x50,
125 0x12, 0x03, 0x24, 0x01, 0x95, 0x00
126};
127
Holger Hans Peter Freytherf1924982010-05-15 23:54:04 +0800128/* paging response */
129static const uint8_t pag_resp[] = {
130 0x00, 0x2c, 0xfd, 0x01, 0xe5, 0x68,
131 0x14, 0x02, 0x02, 0x04, 0x02, 0x42, 0xfe, 0x0f,
132 0x1f, 0x00, 0x1d, 0x57, 0x05, 0x08, 0x00, 0x72,
133 0xf4, 0x80, 0x20, 0x16, 0xc3, 0x50, 0x17, 0x10,
134 0x06, 0x27, 0x01, 0x03, 0x30, 0x18, 0x96, 0x08,
135 0x29, 0x26, 0x30, 0x32, 0x11, 0x42, 0x01, 0x19,
136 0x00
137};
138
Holger Hans Peter Freyther0b8f69d2010-06-15 18:45:38 +0800139struct filter_result {
Holger Hans Peter Freytherdbd16fe2010-07-23 19:08:55 +0800140 const uint8_t *data;
Holger Hans Peter Freythere2c15202010-07-23 19:09:21 +0800141 const uint16_t length;
Holger Hans Peter Freyther1d6fb182010-01-30 11:53:30 +0100142 const int dir;
Holger Hans Peter Freyther0b8f69d2010-06-15 18:45:38 +0800143 const int result;
144};
145
146static const struct filter_result results[] = {
147 {
148 .data = ipa_id,
149 .length = ARRAY_SIZE(ipa_id),
Holger Hans Peter Freyther1d6fb182010-01-30 11:53:30 +0100150 .dir = DIR_MSC,
151 .result = 1,
Holger Hans Peter Freyther0b8f69d2010-06-15 18:45:38 +0800152 },
153 {
154 .data = gsm_reset,
155 .length = ARRAY_SIZE(gsm_reset),
Holger Hans Peter Freyther1d6fb182010-01-30 11:53:30 +0100156 .dir = DIR_MSC,
157 .result = 1,
Holger Hans Peter Freyther0b8f69d2010-06-15 18:45:38 +0800158 },
159 {
160 .data = gsm_reset_ack,
161 .length = ARRAY_SIZE(gsm_reset_ack),
Holger Hans Peter Freyther1d6fb182010-01-30 11:53:30 +0100162 .dir = DIR_BSC,
163 .result = 1,
Holger Hans Peter Freyther0b8f69d2010-06-15 18:45:38 +0800164 },
165 {
166 .data = gsm_paging,
167 .length = ARRAY_SIZE(gsm_paging),
Holger Hans Peter Freyther1d6fb182010-01-30 11:53:30 +0100168 .dir = DIR_BSC,
169 .result = 0,
Holger Hans Peter Freyther0b8f69d2010-06-15 18:45:38 +0800170 },
171 {
172 .data = bssmap_cr,
173 .length = ARRAY_SIZE(bssmap_cr),
Holger Hans Peter Freyther1d6fb182010-01-30 11:53:30 +0100174 .dir = DIR_MSC,
175 .result = 0,
Holger Hans Peter Freyther0b8f69d2010-06-15 18:45:38 +0800176 },
177 {
178 .data = bssmap_cc,
179 .length = ARRAY_SIZE(bssmap_cc),
Holger Hans Peter Freyther1d6fb182010-01-30 11:53:30 +0100180 .dir = DIR_BSC,
181 .result = 0,
Holger Hans Peter Freyther0b8f69d2010-06-15 18:45:38 +0800182 },
183 {
184 .data = bssmap_released,
185 .length = ARRAY_SIZE(bssmap_released),
Holger Hans Peter Freyther1d6fb182010-01-30 11:53:30 +0100186 .dir = DIR_MSC,
187 .result = 0,
Holger Hans Peter Freyther0b8f69d2010-06-15 18:45:38 +0800188 },
189 {
190 .data = bssmap_release_complete,
191 .length = ARRAY_SIZE(bssmap_release_complete),
Holger Hans Peter Freyther1d6fb182010-01-30 11:53:30 +0100192 .dir = DIR_BSC,
193 .result = 0,
Holger Hans Peter Freyther0b8f69d2010-06-15 18:45:38 +0800194 },
Holger Hans Peter Freythera128d912010-04-01 08:47:12 +0200195 {
196 .data = mgcp_msg,
197 .length = ARRAY_SIZE(mgcp_msg),
198 .dir = DIR_MSC,
199 .result = 0,
200 },
Holger Hans Peter Freyther0a6f62f2010-04-06 10:22:01 +0200201 {
202 .data = connnection_it,
203 .length = ARRAY_SIZE(connnection_it),
204 .dir = DIR_BSC,
205 .result = 0,
206 },
207 {
208 .data = connnection_it,
209 .length = ARRAY_SIZE(connnection_it),
210 .dir = DIR_MSC,
211 .result = 0,
212 },
Holger Hans Peter Freyther5e63f922010-04-21 15:45:26 +0800213 {
214 .data = proto_error,
215 .length = ARRAY_SIZE(proto_error),
216 .dir = DIR_BSC,
217 .result = 0,
218 },
219 {
220 .data = proto_error,
221 .length = ARRAY_SIZE(proto_error),
222 .dir = DIR_MSC,
223 .result = 0,
224 },
225
Holger Hans Peter Freyther0b8f69d2010-06-15 18:45:38 +0800226};
227
Holger Hans Peter Freyther38f7c752010-06-15 18:48:36 +0800228static void test_filter(void)
Holger Hans Peter Freyther0b8f69d2010-06-15 18:45:38 +0800229{
230 int i;
231
232
233 /* start testinh with proper messages */
Holger Hans Peter Freytherf5ede522012-01-06 13:56:12 +0100234 printf("Testing BSS Filtering.\n");
Holger Hans Peter Freyther0b8f69d2010-06-15 18:45:38 +0800235 for (i = 0; i < ARRAY_SIZE(results); ++i) {
236 int result;
237 struct bsc_nat_parsed *parsed;
238 struct msgb *msg = msgb_alloc(4096, "test-message");
239
Holger Hans Peter Freytherf5ede522012-01-06 13:56:12 +0100240 printf("Going to test item: %d\n", i);
Holger Hans Peter Freyther0b8f69d2010-06-15 18:45:38 +0800241 memcpy(msg->data, results[i].data, results[i].length);
242 msg->l2h = msgb_put(msg, results[i].length);
243
244 parsed = bsc_nat_parse(msg);
245 if (!parsed) {
Holger Hans Peter Freytherf5ede522012-01-06 13:56:12 +0100246 printf("FAIL: Failed to parse the message\n");
Holger Hans Peter Freyther0b8f69d2010-06-15 18:45:38 +0800247 continue;
248 }
249
Holger Hans Peter Freyther1d6fb182010-01-30 11:53:30 +0100250 result = bsc_nat_filter_ipa(results[i].dir, msg, parsed);
Holger Hans Peter Freyther0b8f69d2010-06-15 18:45:38 +0800251 if (result != results[i].result) {
Holger Hans Peter Freytherf5ede522012-01-06 13:56:12 +0100252 printf("FAIL: Not the expected result got: %d wanted: %d\n",
Holger Hans Peter Freyther0b8f69d2010-06-15 18:45:38 +0800253 result, results[i].result);
254 }
255
256 msgb_free(msg);
257 }
Holger Hans Peter Freyther38f7c752010-06-15 18:48:36 +0800258}
Holger Hans Peter Freyther0b8f69d2010-06-15 18:45:38 +0800259
Holger Hans Peter Freyther38f7c752010-06-15 18:48:36 +0800260#include "bsc_data.c"
261
Holger Hans Peter Freytherdbd16fe2010-07-23 19:08:55 +0800262static void copy_to_msg(struct msgb *msg, const uint8_t *data, unsigned int length)
Holger Hans Peter Freyther38f7c752010-06-15 18:48:36 +0800263{
264 msgb_reset(msg);
265 msg->l2h = msgb_put(msg, length);
266 memcpy(msg->l2h, data, msgb_l2len(msg));
267}
268
Holger Hans Peter Freyther50be1a92012-01-10 22:31:39 +0100269static void verify_msg(struct msgb *out, const uint8_t *ref, int ref_len)
270{
271 if (out->len != ref_len) {
Holger Hans Peter Freytherbe530122012-01-18 17:20:23 +0100272 printf("FAIL: The size should match: %d vs. %d\n",
273 out->len, ref_len);
274 printf("%s\n", osmo_hexdump(out->data, out->len));
275 printf("Wanted\n");
276 printf("%s\n", osmo_hexdump(ref, ref_len));
Holger Hans Peter Freyther50be1a92012-01-10 22:31:39 +0100277 abort();
278 }
279
280 if (memcmp(out->data, ref, out->len) != 0) {
281 printf("FAIL: the data should be changed.\n");
282 printf("%s\n", osmo_hexdump(out->data, out->len));
283 printf("Wanted\n");
284 printf("%s\n", osmo_hexdump(ref, ref_len));
285 abort();
286 }
287}
288
289
Holger Hans Peter Freyther38f7c752010-06-15 18:48:36 +0800290#define VERIFY(con_found, con, msg, ver, str) \
Holger Hans Peter Freytherf5ede522012-01-06 13:56:12 +0100291 if (!con_found) { \
292 printf("Failed to find connection.\n"); \
293 abort(); \
294 } \
295 if (con_found->bsc != con) { \
296 printf("Got connection of the wrong BSC: %d\n", \
297 con_found->bsc->cfg->nr); \
298 abort(); \
299 } \
Holger Hans Peter Freyther38f7c752010-06-15 18:48:36 +0800300 if (memcmp(msg->data, ver, sizeof(ver)) != 0) { \
Holger Hans Peter Freytherf5ede522012-01-06 13:56:12 +0100301 printf("Failed to patch the %s msg.\n", str); \
Holger Hans Peter Freyther38f7c752010-06-15 18:48:36 +0800302 abort(); \
303 }
304
305/* test conn tracking once */
306static void test_contrack()
307{
Holger Hans Peter Freyther38f7c752010-06-15 18:48:36 +0800308 struct bsc_nat *nat;
Holger Hans Peter Freyther49c7fb52010-06-15 18:48:55 +0800309 struct bsc_connection *con;
Holger Hans Peter Freytherc279e392013-04-16 09:53:13 +0200310 struct nat_sccp_connection *con_found;
311 struct nat_sccp_connection *rc_con;
Holger Hans Peter Freyther38f7c752010-06-15 18:48:36 +0800312 struct bsc_nat_parsed *parsed;
313 struct msgb *msg;
314
Holger Hans Peter Freytherf5ede522012-01-06 13:56:12 +0100315 printf("Testing connection tracking.\n");
Holger Hans Peter Freyther38f7c752010-06-15 18:48:36 +0800316 nat = bsc_nat_alloc();
317 con = bsc_connection_alloc(nat);
Holger Hans Peter Freyther0bd60f32010-10-08 22:08:29 +0800318 con->cfg = bsc_config_alloc(nat, "foo");
319 bsc_config_add_lac(con->cfg, 23);
320 bsc_config_add_lac(con->cfg, 49);
321 bsc_config_add_lac(con->cfg, 42);
322 bsc_config_del_lac(con->cfg, 49);
323 bsc_config_add_lac(con->cfg, 1111);
Holger Hans Peter Freyther38f7c752010-06-15 18:48:36 +0800324 msg = msgb_alloc(4096, "test");
325
326 /* 1.) create a connection */
327 copy_to_msg(msg, bsc_cr, sizeof(bsc_cr));
328 parsed = bsc_nat_parse(msg);
Holger Hans Peter Freytherb5513ca2010-04-21 18:56:12 +0800329 con_found = patch_sccp_src_ref_to_msc(msg, parsed, con);
Holger Hans Peter Freyther38f7c752010-06-15 18:48:36 +0800330 if (con_found != NULL) {
Holger Hans Peter Freytherf5ede522012-01-06 13:56:12 +0100331 printf("Con should not exist realref(%u)\n",
332 sccp_src_ref_to_int(&con_found->real_ref));
Holger Hans Peter Freyther38f7c752010-06-15 18:48:36 +0800333 abort();
334 }
Holger Hans Peter Freytherfa20c942010-05-16 16:51:31 +0800335 rc_con = create_sccp_src_ref(con, parsed);
336 if (!rc_con) {
Holger Hans Peter Freytherf5ede522012-01-06 13:56:12 +0100337 printf("Failed to create a ref\n");
Holger Hans Peter Freyther38f7c752010-06-15 18:48:36 +0800338 abort();
339 }
Holger Hans Peter Freytherb5513ca2010-04-21 18:56:12 +0800340 con_found = patch_sccp_src_ref_to_msc(msg, parsed, con);
Holger Hans Peter Freytherf5ede522012-01-06 13:56:12 +0100341 if (!con_found) {
342 printf("Failed to find connection.\n");
343 abort();
344 }
345 if (con_found->bsc != con) {
346 printf("Got connection of the wrong BSC: %d\n",
347 con_found->bsc->cfg->nr);
Holger Hans Peter Freyther38f7c752010-06-15 18:48:36 +0800348 abort();
349 }
Holger Hans Peter Freytherfa20c942010-05-16 16:51:31 +0800350 if (con_found != rc_con) {
Holger Hans Peter Freytherf5ede522012-01-06 13:56:12 +0100351 printf("Failed to find the right connection.\n");
Holger Hans Peter Freytherfa20c942010-05-16 16:51:31 +0800352 abort();
353 }
Holger Hans Peter Freyther38f7c752010-06-15 18:48:36 +0800354 if (memcmp(msg->data, bsc_cr_patched, sizeof(bsc_cr_patched)) != 0) {
Holger Hans Peter Freytherf5ede522012-01-06 13:56:12 +0100355 printf("Failed to patch the BSC CR msg.\n");
Holger Hans Peter Freyther38f7c752010-06-15 18:48:36 +0800356 abort();
357 }
358 talloc_free(parsed);
359
360 /* 2.) get the cc */
361 copy_to_msg(msg, msc_cc, sizeof(msc_cc));
362 parsed = bsc_nat_parse(msg);
Holger Hans Peter Freyther49c7fb52010-06-15 18:48:55 +0800363 con_found = patch_sccp_src_ref_to_bsc(msg, parsed, nat);
364 VERIFY(con_found, con, msg, msc_cc_patched, "MSC CC");
365 if (update_sccp_src_ref(con_found, parsed) != 0) {
Holger Hans Peter Freytherf5ede522012-01-06 13:56:12 +0100366 printf("Failed to update the SCCP con.\n");
Holger Hans Peter Freyther38f7c752010-06-15 18:48:36 +0800367 abort();
368 }
Holger Hans Peter Freyther38f7c752010-06-15 18:48:36 +0800369
370 /* 3.) send some data */
371 copy_to_msg(msg, bsc_dtap, sizeof(bsc_dtap));
372 parsed = bsc_nat_parse(msg);
Holger Hans Peter Freytherb5513ca2010-04-21 18:56:12 +0800373 con_found = patch_sccp_src_ref_to_msc(msg, parsed, con);
Holger Hans Peter Freyther38f7c752010-06-15 18:48:36 +0800374 VERIFY(con_found, con, msg, bsc_dtap_patched, "BSC DTAP");
375
376 /* 4.) receive some data */
377 copy_to_msg(msg, msc_dtap, sizeof(msc_dtap));
378 parsed = bsc_nat_parse(msg);
379 con_found = patch_sccp_src_ref_to_bsc(msg, parsed, nat);
380 VERIFY(con_found, con, msg, msc_dtap_patched, "MSC DTAP");
381
382 /* 5.) close the connection */
383 copy_to_msg(msg, msc_rlsd, sizeof(msc_rlsd));
384 parsed = bsc_nat_parse(msg);
385 con_found = patch_sccp_src_ref_to_bsc(msg, parsed, nat);
386 VERIFY(con_found, con, msg, msc_rlsd_patched, "MSC RLSD");
387
388 /* 6.) confirm the connection close */
389 copy_to_msg(msg, bsc_rlc, sizeof(bsc_rlc));
390 parsed = bsc_nat_parse(msg);
Holger Hans Peter Freytherb5513ca2010-04-21 18:56:12 +0800391 con_found = patch_sccp_src_ref_to_msc(msg, parsed, con);
Holger Hans Peter Freytherf5ede522012-01-06 13:56:12 +0100392 if (!con_found) {
393 printf("Failed to find connection.\n");
394 abort();
395 }
396 if (con_found->bsc != con) {
397 printf("Got connection of the wrong BSC: %d\n",
398 con_found->bsc->cfg->nr);
Holger Hans Peter Freyther38f7c752010-06-15 18:48:36 +0800399 abort();
400 }
401 if (memcmp(msg->data, bsc_rlc_patched, sizeof(bsc_rlc_patched)) != 0) {
Holger Hans Peter Freytherf5ede522012-01-06 13:56:12 +0100402 printf("Failed to patch the BSC CR msg.\n");
Holger Hans Peter Freyther38f7c752010-06-15 18:48:36 +0800403 abort();
404 }
405 remove_sccp_src_ref(con, msg, parsed);
Holger Hans Peter Freyther9d518552010-04-05 21:44:51 +0200406 talloc_free(parsed);
407
408 copy_to_msg(msg, bsc_rlc, sizeof(bsc_rlc));
409 parsed = bsc_nat_parse(msg);
Holger Hans Peter Freytherb5513ca2010-04-21 18:56:12 +0800410 con_found = patch_sccp_src_ref_to_msc(msg, parsed, con);
Holger Hans Peter Freyther38f7c752010-06-15 18:48:36 +0800411
412 /* verify that it is gone */
413 if (con_found != NULL) {
Holger Hans Peter Freytherf5ede522012-01-06 13:56:12 +0100414 printf("Con should not exist real_ref(%u)\n",
415 sccp_src_ref_to_int(&con_found->real_ref));
Holger Hans Peter Freyther38f7c752010-06-15 18:48:36 +0800416 abort();
417 }
418 talloc_free(parsed);
419
420
Holger Hans Peter Freyther9212d9d2011-02-27 11:18:41 +0100421 bsc_config_free(con->cfg);
Holger Hans Peter Freyther38f7c752010-06-15 18:48:36 +0800422 talloc_free(nat);
423 msgb_free(msg);
424}
425
Holger Hans Peter Freyther04fd9922010-03-30 06:51:53 +0200426static void test_paging(void)
427{
428 struct bsc_nat *nat;
429 struct bsc_connection *con;
Holger Hans Peter Freyther0bd60f32010-10-08 22:08:29 +0800430 struct bsc_config *cfg;
Holger Hans Peter Freyther04fd9922010-03-30 06:51:53 +0200431
Holger Hans Peter Freytherf5ede522012-01-06 13:56:12 +0100432 printf("Testing paging by lac.\n");
Holger Hans Peter Freyther04fd9922010-03-30 06:51:53 +0200433
434 nat = bsc_nat_alloc();
435 con = bsc_connection_alloc(nat);
Holger Hans Peter Freyther0bd60f32010-10-08 22:08:29 +0800436 cfg = bsc_config_alloc(nat, "unknown");
437 con->cfg = cfg;
438 bsc_config_add_lac(cfg, 23);
Holger Hans Peter Freyther04fd9922010-03-30 06:51:53 +0200439 con->authenticated = 1;
440 llist_add(&con->list_entry, &nat->bsc_connections);
Holger Hans Peter Freyther04fd9922010-03-30 06:51:53 +0200441
442 /* Test it by not finding it */
Holger Hans Peter Freyther1ffe98c2011-05-02 16:20:32 +0200443 if (bsc_config_handles_lac(cfg, 8213) != 0) {
Holger Hans Peter Freytherf5ede522012-01-06 13:56:12 +0100444 printf("Should not be handled.\n");
Holger Hans Peter Freyther04fd9922010-03-30 06:51:53 +0200445 abort();
446 }
Holger Hans Peter Freyther04fd9922010-03-30 06:51:53 +0200447
448 /* Test by finding it */
Holger Hans Peter Freyther0bd60f32010-10-08 22:08:29 +0800449 bsc_config_del_lac(cfg, 23);
450 bsc_config_add_lac(cfg, 8213);
Holger Hans Peter Freyther1ffe98c2011-05-02 16:20:32 +0200451 if (bsc_config_handles_lac(cfg, 8213) == 0) {
Holger Hans Peter Freytherf5ede522012-01-06 13:56:12 +0100452 printf("Should have found it.\n");
Holger Hans Peter Freyther04fd9922010-03-30 06:51:53 +0200453 abort();
454 }
Holger Hans Peter Freyther3615a302013-06-25 12:03:36 +0200455
456 talloc_free(nat);
Holger Hans Peter Freyther04fd9922010-03-30 06:51:53 +0200457}
458
Holger Hans Peter Freythera9e93312011-02-26 11:38:00 +0100459static void test_mgcp_allocations(void)
460{
461#if 0
462 struct bsc_connection *bsc;
463 struct bsc_nat *nat;
Holger Hans Peter Freytherc279e392013-04-16 09:53:13 +0200464 struct nat_sccp_connection con;
Holger Hans Peter Freyther9ec030d2011-02-27 11:04:27 +0100465 int i, j, multiplex;
Holger Hans Peter Freythera9e93312011-02-26 11:38:00 +0100466
Holger Hans Peter Freytherf5ede522012-01-06 13:56:12 +0100467 printf("Testing MGCP.\n");
Holger Hans Peter Freythera9e93312011-02-26 11:38:00 +0100468 memset(&con, 0, sizeof(con));
469
470 nat = bsc_nat_alloc();
471 nat->bsc_endpoints = talloc_zero_array(nat,
472 struct bsc_endpoint,
473 65);
474 nat->mgcp_cfg = mgcp_config_alloc();
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100475 nat->mgcp_cfg->trunk.number_endpoints = 64;
Holger Hans Peter Freythera9e93312011-02-26 11:38:00 +0100476
477 bsc = bsc_connection_alloc(nat);
478 bsc->cfg = bsc_config_alloc(nat, "foo");
Holger Hans Peter Freyther9ec030d2011-02-27 11:04:27 +0100479 bsc->cfg->max_endpoints = 60;
Holger Hans Peter Freythera9e93312011-02-26 11:38:00 +0100480 bsc_config_add_lac(bsc->cfg, 2323);
481 bsc->last_endpoint = 0x22;
482 con.bsc = bsc;
483
484 bsc_init_endps_if_needed(bsc);
485
486 i = 1;
487 do {
488 if (bsc_assign_endpoint(bsc, &con) != 0) {
Holger Hans Peter Freytherf5ede522012-01-06 13:56:12 +0100489 printf("failed to allocate... on iteration %d\n", i);
Holger Hans Peter Freythera9e93312011-02-26 11:38:00 +0100490 break;
491 }
492 ++i;
493 } while(1);
494
Holger Hans Peter Freyther9ec030d2011-02-27 11:04:27 +0100495 multiplex = bsc_mgcp_nr_multiplexes(bsc->cfg->max_endpoints);
496 for (i = 0; i < multiplex; ++i) {
Holger Hans Peter Freythera9e93312011-02-26 11:38:00 +0100497 for (j = 0; j < 32; ++j)
498 printf("%d", bsc->_endpoint_status[i*32 + j]);
499 printf(": %d of %d\n", i*32 + 32, 32 * 8);
500 }
501#endif
502}
503
Holger Hans Peter Freytherfc9bd232010-04-01 03:55:27 +0200504static void test_mgcp_ass_tracking(void)
Holger Hans Peter Freyther465313e2010-06-15 18:49:53 +0800505{
Holger Hans Peter Freyther7b7eef62010-04-22 12:08:17 +0800506 struct bsc_connection *bsc;
507 struct bsc_nat *nat;
Holger Hans Peter Freytherc279e392013-04-16 09:53:13 +0200508 struct nat_sccp_connection con;
Holger Hans Peter Freyther465313e2010-06-15 18:49:53 +0800509 struct bsc_nat_parsed *parsed;
510 struct msgb *msg;
511
Holger Hans Peter Freytherf5ede522012-01-06 13:56:12 +0100512 printf("Testing MGCP.\n");
Holger Hans Peter Freyther465313e2010-06-15 18:49:53 +0800513 memset(&con, 0, sizeof(con));
514
Holger Hans Peter Freyther7b7eef62010-04-22 12:08:17 +0800515 nat = bsc_nat_alloc();
516 nat->bsc_endpoints = talloc_zero_array(nat,
517 struct bsc_endpoint,
518 33);
Holger Hans Peter Freyther7e0cc502011-02-25 12:43:58 +0100519 nat->mgcp_cfg = mgcp_config_alloc();
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100520 nat->mgcp_cfg->trunk.number_endpoints = 64;
Holger Hans Peter Freyther462b7d72012-10-24 21:53:40 +0200521 mgcp_endpoints_allocate(&nat->mgcp_cfg->trunk);
Holger Hans Peter Freyther7e0cc502011-02-25 12:43:58 +0100522
Holger Hans Peter Freyther7b7eef62010-04-22 12:08:17 +0800523 bsc = bsc_connection_alloc(nat);
Holger Hans Peter Freyther0bd60f32010-10-08 22:08:29 +0800524 bsc->cfg = bsc_config_alloc(nat, "foo");
525 bsc_config_add_lac(bsc->cfg, 2323);
Holger Hans Peter Freyther86c1db62011-02-25 17:10:25 +0100526 bsc->last_endpoint = 0x1e;
Holger Hans Peter Freyther7b7eef62010-04-22 12:08:17 +0800527 con.bsc = bsc;
528
Holger Hans Peter Freyther465313e2010-06-15 18:49:53 +0800529 msg = msgb_alloc(4096, "foo");
530 copy_to_msg(msg, ass_cmd, sizeof(ass_cmd));
531 parsed = bsc_nat_parse(msg);
Holger Hans Peter Freythercd702372010-09-20 01:21:51 +0800532
533 if (msg->l2h[16] != 0 ||
534 msg->l2h[17] != 0x1) {
Holger Hans Peter Freytherf5ede522012-01-06 13:56:12 +0100535 printf("Input is not as expected.. %s 0x%x\n",
Pablo Neira Ayusoc0d17f22011-05-07 12:12:48 +0200536 osmo_hexdump(msg->l2h, msgb_l2len(msg)),
Holger Hans Peter Freythercd702372010-09-20 01:21:51 +0800537 msg->l2h[17]);
538 abort();
539 }
540
Holger Hans Peter Freyther45fd07d2010-08-28 18:22:14 +0800541 if (bsc_mgcp_assign_patch(&con, msg) != 0) {
Holger Hans Peter Freytherf5ede522012-01-06 13:56:12 +0100542 printf("Failed to handle assignment.\n");
Holger Hans Peter Freyther465313e2010-06-15 18:49:53 +0800543 abort();
544 }
545
Holger Hans Peter Freythercd702372010-09-20 01:21:51 +0800546 if (con.msc_endp != 1) {
Holger Hans Peter Freytherf5ede522012-01-06 13:56:12 +0100547 printf("Timeslot should be 1.\n");
Holger Hans Peter Freyther465313e2010-06-15 18:49:53 +0800548 abort();
549 }
550
Holger Hans Peter Freyther86c1db62011-02-25 17:10:25 +0100551 if (con.bsc_endp != 0x1) {
Holger Hans Peter Freytherf5ede522012-01-06 13:56:12 +0100552 printf("Assigned timeslot should have been 1.\n");
Holger Hans Peter Freyther465313e2010-06-15 18:49:53 +0800553 abort();
554 }
Holger Hans Peter Freyther86c1db62011-02-25 17:10:25 +0100555 if (con.bsc->_endpoint_status[0x1] != 1) {
Holger Hans Peter Freytherf5ede522012-01-06 13:56:12 +0100556 printf("The status on the BSC is wrong.\n");
Holger Hans Peter Freyther45fd07d2010-08-28 18:22:14 +0800557 abort();
558 }
559
Holger Hans Peter Freythercd702372010-09-20 01:21:51 +0800560 int multiplex, timeslot;
Holger Hans Peter Freyther86c1db62011-02-25 17:10:25 +0100561 mgcp_endpoint_to_timeslot(0x1, &multiplex, &timeslot);
Holger Hans Peter Freythercd702372010-09-20 01:21:51 +0800562
563 uint16_t cic = htons(timeslot & 0x1f);
564 if (memcmp(&cic, &msg->l2h[16], sizeof(cic)) != 0) {
Holger Hans Peter Freytherf5ede522012-01-06 13:56:12 +0100565 printf("Message was not patched properly\n");
566 printf("data cic: 0x%x %s\n", cic, osmo_hexdump(msg->l2h, msgb_l2len(msg)));
Holger Hans Peter Freythercd702372010-09-20 01:21:51 +0800567 abort();
568 }
569
Holger Hans Peter Freyther465313e2010-06-15 18:49:53 +0800570 talloc_free(parsed);
571
Holger Hans Peter Freyther7b7eef62010-04-22 12:08:17 +0800572 bsc_mgcp_dlcx(&con);
Holger Hans Peter Freytherd2df4ca2010-09-19 20:54:21 +0800573 if (con.bsc_endp != -1 || con.msc_endp != -1 ||
Holger Hans Peter Freyther86c1db62011-02-25 17:10:25 +0100574 con.bsc->_endpoint_status[1] != 0 || con.bsc->last_endpoint != 0x1) {
Holger Hans Peter Freytherf5ede522012-01-06 13:56:12 +0100575 printf("Clearing should remove the mapping.\n");
Holger Hans Peter Freyther465313e2010-06-15 18:49:53 +0800576 abort();
577 }
Holger Hans Peter Freyther7b7eef62010-04-22 12:08:17 +0800578
Holger Hans Peter Freyther9212d9d2011-02-27 11:18:41 +0100579 bsc_config_free(bsc->cfg);
Holger Hans Peter Freyther7b7eef62010-04-22 12:08:17 +0800580 talloc_free(nat);
Holger Hans Peter Freyther465313e2010-06-15 18:49:53 +0800581}
582
Holger Hans Peter Freytherfc9bd232010-04-01 03:55:27 +0200583/* test the code to find a given connection */
584static void test_mgcp_find(void)
585{
586 struct bsc_nat *nat;
587 struct bsc_connection *con;
Holger Hans Peter Freytherc279e392013-04-16 09:53:13 +0200588 struct nat_sccp_connection *sccp_con;
Holger Hans Peter Freytherfc9bd232010-04-01 03:55:27 +0200589
Holger Hans Peter Freytherf5ede522012-01-06 13:56:12 +0100590 printf("Testing finding of a BSC Connection\n");
Holger Hans Peter Freytherfc9bd232010-04-01 03:55:27 +0200591
592 nat = bsc_nat_alloc();
593 con = bsc_connection_alloc(nat);
594 llist_add(&con->list_entry, &nat->bsc_connections);
595
Holger Hans Peter Freytherc279e392013-04-16 09:53:13 +0200596 sccp_con = talloc_zero(con, struct nat_sccp_connection);
Holger Hans Peter Freytherf4b34392010-08-28 16:08:39 +0800597 sccp_con->msc_endp = 12;
598 sccp_con->bsc_endp = 12;
Holger Hans Peter Freytherfc9bd232010-04-01 03:55:27 +0200599 sccp_con->bsc = con;
600 llist_add(&sccp_con->list_entry, &nat->sccp_connections);
601
602 if (bsc_mgcp_find_con(nat, 11) != NULL) {
Holger Hans Peter Freytherf5ede522012-01-06 13:56:12 +0100603 printf("Found the wrong connection.\n");
Holger Hans Peter Freytherfc9bd232010-04-01 03:55:27 +0200604 abort();
605 }
606
Holger Hans Peter Freyther08a1b162010-04-18 02:26:16 +0800607 if (bsc_mgcp_find_con(nat, 12) != sccp_con) {
Holger Hans Peter Freytherf5ede522012-01-06 13:56:12 +0100608 printf("Didn't find the connection\n");
Holger Hans Peter Freytherfc9bd232010-04-01 03:55:27 +0200609 abort();
610 }
611
Holger Hans Peter Freytherfc9bd232010-04-01 03:55:27 +0200612 /* free everything */
613 talloc_free(nat);
614}
615
Holger Hans Peter Freyther76c83542010-04-01 06:48:52 +0200616static void test_mgcp_rewrite(void)
617{
618 int i;
Holger Hans Peter Freyther8d200652010-04-04 18:09:10 +0200619 struct msgb *output;
Holger Hans Peter Freytherf5ede522012-01-06 13:56:12 +0100620 printf("Testing rewriting MGCP messages.\n");
Holger Hans Peter Freyther76c83542010-04-01 06:48:52 +0200621
Holger Hans Peter Freyther76c83542010-04-01 06:48:52 +0200622 for (i = 0; i < ARRAY_SIZE(mgcp_messages); ++i) {
623 const char *orig = mgcp_messages[i].orig;
624 const char *patc = mgcp_messages[i].patch;
625 const char *ip = mgcp_messages[i].ip;
626 const int port = mgcp_messages[i].port;
Jacob Erlbecka52ac662013-11-29 13:43:45 +0100627 const int expected_payload_type = mgcp_messages[i].payload_type;
628 int payload_type = -1;
Holger Hans Peter Freyther76c83542010-04-01 06:48:52 +0200629
Holger Hans Peter Freyther8d200652010-04-04 18:09:10 +0200630 char *input = strdup(orig);
Holger Hans Peter Freyther76c83542010-04-01 06:48:52 +0200631
Jacob Erlbecka52ac662013-11-29 13:43:45 +0100632 output = bsc_mgcp_rewrite(input, strlen(input), 0x1e,
Jacob Erlbeck3dff27d2013-11-29 13:43:48 +0100633 ip, port, &payload_type);
Jacob Erlbecka52ac662013-11-29 13:43:45 +0100634
635 if (payload_type != -1) {
636 fprintf(stderr, "Found media payload type %d in SDP data\n",
637 payload_type);
638 if (payload_type != expected_payload_type) {
639 printf("Wrong payload type %d (expected %d)\n",
640 payload_type, expected_payload_type);
641 abort();
642 }
643 }
644
Holger Hans Peter Freyther76c83542010-04-01 06:48:52 +0200645 if (msgb_l2len(output) != strlen(patc)) {
Holger Hans Peter Freytherf5ede522012-01-06 13:56:12 +0100646 printf("Wrong sizes for test: %d %d != %d != %d\n", i, msgb_l2len(output), strlen(patc), strlen(orig));
647 printf("String '%s' vs '%s'\n", (const char *) output->l2h, patc);
Holger Hans Peter Freyther76c83542010-04-01 06:48:52 +0200648 abort();
649 }
650
651 if (memcmp(output->l2h, patc, msgb_l2len(output)) != 0) {
Holger Hans Peter Freytherf5ede522012-01-06 13:56:12 +0100652 printf("Broken on %d msg: '%s'\n", i, (const char *) output->l2h);
Holger Hans Peter Freyther76c83542010-04-01 06:48:52 +0200653 abort();
654 }
655
656 msgb_free(output);
Holger Hans Peter Freyther8d200652010-04-04 18:09:10 +0200657 free(input);
Holger Hans Peter Freyther76c83542010-04-01 06:48:52 +0200658 }
Holger Hans Peter Freyther76c83542010-04-01 06:48:52 +0200659}
660
Holger Hans Peter Freyther3c3bce12010-04-01 10:16:28 +0200661static void test_mgcp_parse(void)
662{
663 int code, ci;
664 char transaction[60];
665
Holger Hans Peter Freytherf5ede522012-01-06 13:56:12 +0100666 printf("Testing MGCP response parsing.\n");
Holger Hans Peter Freyther3c3bce12010-04-01 10:16:28 +0200667
668 if (bsc_mgcp_parse_response(crcx_resp, &code, transaction) != 0) {
Holger Hans Peter Freytherf5ede522012-01-06 13:56:12 +0100669 printf("Failed to parse CRCX resp.\n");
Holger Hans Peter Freyther3c3bce12010-04-01 10:16:28 +0200670 abort();
671 }
672
673 if (code != 200) {
Holger Hans Peter Freytherf5ede522012-01-06 13:56:12 +0100674 printf("Failed to parse the CODE properly. Got: %d\n", code);
Holger Hans Peter Freyther3c3bce12010-04-01 10:16:28 +0200675 abort();
676 }
677
678 if (strcmp(transaction, "23265295") != 0) {
Holger Hans Peter Freytherf5ede522012-01-06 13:56:12 +0100679 printf("Failed to parse transaction id: '%s'\n", transaction);
Holger Hans Peter Freyther3c3bce12010-04-01 10:16:28 +0200680 abort();
681 }
682
683 ci = bsc_mgcp_extract_ci(crcx_resp);
684 if (ci != 1) {
Holger Hans Peter Freytherf5ede522012-01-06 13:56:12 +0100685 printf("Failed to parse the CI. Got: %d\n", ci);
Holger Hans Peter Freyther3c3bce12010-04-01 10:16:28 +0200686 abort();
687 }
688}
689
Holger Hans Peter Freyther34a96ae2010-05-14 19:49:35 +0800690struct cr_filter {
Holger Hans Peter Freytherdbd16fe2010-07-23 19:08:55 +0800691 const uint8_t *data;
Holger Hans Peter Freyther34a96ae2010-05-14 19:49:35 +0800692 int length;
693 int result;
Holger Hans Peter Freyther19c0a842010-05-16 02:00:40 +0800694 int contype;
Holger Hans Peter Freyther34a96ae2010-05-14 19:49:35 +0800695
696 const char *bsc_imsi_allow;
697 const char *bsc_imsi_deny;
Holger Hans Peter Freyther34a96ae2010-05-14 19:49:35 +0800698 const char *nat_imsi_deny;
Holger Hans Peter Freyther415cd2e2014-01-20 09:55:46 +0100699 int nat_cm_reject_cause;
700 int nat_lu_reject_cause;
701 int bsc_cm_reject_cause;
702 int bsc_lu_reject_cause;
703 int want_cm_reject_cause;
704 int want_lu_reject_cause;
Holger Hans Peter Freyther34a96ae2010-05-14 19:49:35 +0800705};
706
707static struct cr_filter cr_filter[] = {
708 {
709 .data = bssmap_cr,
710 .length = sizeof(bssmap_cr),
Holger Hans Peter Freytherd880f542010-09-15 01:42:07 +0800711 .result = 1,
Holger Hans Peter Freyther19c0a842010-05-16 02:00:40 +0800712 .contype = NAT_CON_TYPE_CM_SERV_REQ,
Holger Hans Peter Freyther415cd2e2014-01-20 09:55:46 +0100713 .nat_cm_reject_cause = GSM48_REJECT_PLMN_NOT_ALLOWED,
714 .nat_lu_reject_cause = GSM48_REJECT_PLMN_NOT_ALLOWED,
715 .bsc_cm_reject_cause = GSM48_REJECT_PLMN_NOT_ALLOWED,
716 .bsc_lu_reject_cause = GSM48_REJECT_PLMN_NOT_ALLOWED,
717 .want_lu_reject_cause = GSM48_REJECT_PLMN_NOT_ALLOWED,
718 .want_cm_reject_cause = GSM48_REJECT_PLMN_NOT_ALLOWED,
Holger Hans Peter Freyther34a96ae2010-05-14 19:49:35 +0800719 },
720 {
721 .data = bss_lu,
722 .length = sizeof(bss_lu),
Holger Hans Peter Freytherd880f542010-09-15 01:42:07 +0800723 .result = 1,
Holger Hans Peter Freyther19c0a842010-05-16 02:00:40 +0800724 .contype = NAT_CON_TYPE_LU,
Holger Hans Peter Freyther415cd2e2014-01-20 09:55:46 +0100725 .nat_cm_reject_cause = GSM48_REJECT_PLMN_NOT_ALLOWED,
726 .nat_lu_reject_cause = GSM48_REJECT_PLMN_NOT_ALLOWED,
727 .bsc_cm_reject_cause = GSM48_REJECT_PLMN_NOT_ALLOWED,
728 .bsc_lu_reject_cause = GSM48_REJECT_PLMN_NOT_ALLOWED,
729 .want_lu_reject_cause = GSM48_REJECT_PLMN_NOT_ALLOWED,
730 .want_cm_reject_cause = GSM48_REJECT_PLMN_NOT_ALLOWED,
Holger Hans Peter Freyther34a96ae2010-05-14 19:49:35 +0800731 },
732 {
Holger Hans Peter Freytherf1924982010-05-15 23:54:04 +0800733 .data = pag_resp,
734 .length = sizeof(pag_resp),
Holger Hans Peter Freytherd880f542010-09-15 01:42:07 +0800735 .result = 1,
Holger Hans Peter Freyther19c0a842010-05-16 02:00:40 +0800736 .contype = NAT_CON_TYPE_PAG_RESP,
Holger Hans Peter Freyther415cd2e2014-01-20 09:55:46 +0100737 .nat_cm_reject_cause = GSM48_REJECT_PLMN_NOT_ALLOWED,
738 .nat_lu_reject_cause = GSM48_REJECT_PLMN_NOT_ALLOWED,
739 .bsc_cm_reject_cause = GSM48_REJECT_PLMN_NOT_ALLOWED,
740 .bsc_lu_reject_cause = GSM48_REJECT_PLMN_NOT_ALLOWED,
741 .want_lu_reject_cause = GSM48_REJECT_PLMN_NOT_ALLOWED,
742 .want_cm_reject_cause = GSM48_REJECT_PLMN_NOT_ALLOWED,
Holger Hans Peter Freytherf1924982010-05-15 23:54:04 +0800743 },
744 {
Holger Hans Peter Freyther34a96ae2010-05-14 19:49:35 +0800745 /* nat deny is before blank/null BSC */
746 .data = bss_lu,
747 .length = sizeof(bss_lu),
748 .result = -3,
749 .nat_imsi_deny = "[0-9]*",
Holger Hans Peter Freyther19c0a842010-05-16 02:00:40 +0800750 .contype = NAT_CON_TYPE_LU,
Holger Hans Peter Freyther415cd2e2014-01-20 09:55:46 +0100751 .nat_cm_reject_cause = GSM48_REJECT_PLMN_NOT_ALLOWED,
752 .nat_lu_reject_cause = GSM48_REJECT_PLMN_NOT_ALLOWED,
753 .bsc_cm_reject_cause = GSM48_REJECT_PLMN_NOT_ALLOWED,
754 .bsc_lu_reject_cause = GSM48_REJECT_PLMN_NOT_ALLOWED,
755 .want_lu_reject_cause = GSM48_REJECT_PLMN_NOT_ALLOWED,
756 .want_cm_reject_cause = GSM48_REJECT_PLMN_NOT_ALLOWED,
Holger Hans Peter Freyther34a96ae2010-05-14 19:49:35 +0800757 },
758 {
Holger Hans Peter Freythera0aeaa72010-05-14 23:07:58 +0800759 /* BSC allow is before NAT deny */
Holger Hans Peter Freyther34a96ae2010-05-14 19:49:35 +0800760 .data = bss_lu,
761 .length = sizeof(bss_lu),
Holger Hans Peter Freytherd880f542010-09-15 01:42:07 +0800762 .result = 1,
Holger Hans Peter Freyther34a96ae2010-05-14 19:49:35 +0800763 .nat_imsi_deny = "[0-9]*",
Holger Hans Peter Freythera0aeaa72010-05-14 23:07:58 +0800764 .bsc_imsi_allow = "2440[0-9]*",
Holger Hans Peter Freyther19c0a842010-05-16 02:00:40 +0800765 .contype = NAT_CON_TYPE_LU,
Holger Hans Peter Freyther415cd2e2014-01-20 09:55:46 +0100766 .nat_cm_reject_cause = GSM48_REJECT_PLMN_NOT_ALLOWED,
767 .nat_lu_reject_cause = GSM48_REJECT_PLMN_NOT_ALLOWED,
768 .bsc_cm_reject_cause = GSM48_REJECT_PLMN_NOT_ALLOWED,
769 .bsc_lu_reject_cause = GSM48_REJECT_PLMN_NOT_ALLOWED,
770 .want_lu_reject_cause = GSM48_REJECT_PLMN_NOT_ALLOWED,
771 .want_cm_reject_cause = GSM48_REJECT_PLMN_NOT_ALLOWED,
Holger Hans Peter Freyther34a96ae2010-05-14 19:49:35 +0800772 },
773 {
774 /* BSC allow is before NAT deny */
775 .data = bss_lu,
776 .length = sizeof(bss_lu),
Holger Hans Peter Freytherd880f542010-09-15 01:42:07 +0800777 .result = 1,
Holger Hans Peter Freyther34a96ae2010-05-14 19:49:35 +0800778 .bsc_imsi_allow = "[0-9]*",
779 .nat_imsi_deny = "[0-9]*",
Holger Hans Peter Freyther19c0a842010-05-16 02:00:40 +0800780 .contype = NAT_CON_TYPE_LU,
Holger Hans Peter Freyther415cd2e2014-01-20 09:55:46 +0100781 .nat_cm_reject_cause = GSM48_REJECT_PLMN_NOT_ALLOWED,
782 .nat_lu_reject_cause = GSM48_REJECT_PLMN_NOT_ALLOWED,
783 .bsc_cm_reject_cause = GSM48_REJECT_PLMN_NOT_ALLOWED,
784 .bsc_lu_reject_cause = GSM48_REJECT_PLMN_NOT_ALLOWED,
785 .want_lu_reject_cause = GSM48_REJECT_PLMN_NOT_ALLOWED,
786 .want_cm_reject_cause = GSM48_REJECT_PLMN_NOT_ALLOWED,
Holger Hans Peter Freyther34a96ae2010-05-14 19:49:35 +0800787 },
788 {
789 /* filter as deny is first */
790 .data = bss_lu,
791 .length = sizeof(bss_lu),
Holger Hans Peter Freyther1fd60632010-10-19 20:55:33 +0200792 .result = 1,
Holger Hans Peter Freyther34a96ae2010-05-14 19:49:35 +0800793 .bsc_imsi_deny = "[0-9]*",
794 .bsc_imsi_allow = "[0-9]*",
795 .nat_imsi_deny = "[0-9]*",
Holger Hans Peter Freyther19c0a842010-05-16 02:00:40 +0800796 .contype = NAT_CON_TYPE_LU,
Holger Hans Peter Freyther415cd2e2014-01-20 09:55:46 +0100797 .nat_cm_reject_cause = GSM48_REJECT_PLMN_NOT_ALLOWED,
798 .nat_lu_reject_cause = GSM48_REJECT_PLMN_NOT_ALLOWED,
799 .bsc_cm_reject_cause = GSM48_REJECT_PLMN_NOT_ALLOWED,
800 .bsc_lu_reject_cause = GSM48_REJECT_PLMN_NOT_ALLOWED,
801 .want_lu_reject_cause = GSM48_REJECT_PLMN_NOT_ALLOWED,
802 .want_cm_reject_cause = GSM48_REJECT_PLMN_NOT_ALLOWED,
Holger Hans Peter Freyther34a96ae2010-05-14 19:49:35 +0800803 },
Holger Hans Peter Freyther1fd60632010-10-19 20:55:33 +0200804 {
805 /* deny by nat rule */
806 .data = bss_lu,
807 .length = sizeof(bss_lu),
808 .result = -3,
809 .bsc_imsi_deny = "000[0-9]*",
810 .nat_imsi_deny = "[0-9]*",
811 .contype = NAT_CON_TYPE_LU,
Holger Hans Peter Freyther415cd2e2014-01-20 09:55:46 +0100812 .nat_cm_reject_cause = GSM48_REJECT_PLMN_NOT_ALLOWED,
813 .nat_lu_reject_cause = GSM48_REJECT_PLMN_NOT_ALLOWED,
814 .bsc_cm_reject_cause = GSM48_REJECT_PLMN_NOT_ALLOWED,
815 .bsc_lu_reject_cause = GSM48_REJECT_PLMN_NOT_ALLOWED,
816 .want_lu_reject_cause = GSM48_REJECT_PLMN_NOT_ALLOWED,
817 .want_cm_reject_cause = GSM48_REJECT_PLMN_NOT_ALLOWED,
818 },
819 {
820 /* deny by nat rule */
821 .data = bss_lu,
822 .length = sizeof(bss_lu),
823 .result = -3,
824 .bsc_imsi_deny = "000[0-9]*",
825 .nat_imsi_deny = "[0-9]*",
826 .contype = NAT_CON_TYPE_LU,
827 .nat_cm_reject_cause = 0x23,
828 .nat_lu_reject_cause = 0x42,
829 .bsc_cm_reject_cause = GSM48_REJECT_PLMN_NOT_ALLOWED,
830 .bsc_lu_reject_cause = GSM48_REJECT_PLMN_NOT_ALLOWED,
831 .want_lu_reject_cause = 0x42,
832 .want_cm_reject_cause = 0x23,
Holger Hans Peter Freyther1fd60632010-10-19 20:55:33 +0200833 },
834 {
835 /* deny by bsc rule */
836 .data = bss_lu,
837 .length = sizeof(bss_lu),
838 .result = -2,
839 .bsc_imsi_deny = "[0-9]*",
840 .contype = NAT_CON_TYPE_LU,
Holger Hans Peter Freyther415cd2e2014-01-20 09:55:46 +0100841 .nat_cm_reject_cause = GSM48_REJECT_PLMN_NOT_ALLOWED,
842 .nat_lu_reject_cause = GSM48_REJECT_PLMN_NOT_ALLOWED,
843 .bsc_cm_reject_cause = GSM48_REJECT_PLMN_NOT_ALLOWED,
844 .bsc_lu_reject_cause = GSM48_REJECT_PLMN_NOT_ALLOWED,
845 .want_lu_reject_cause = GSM48_REJECT_PLMN_NOT_ALLOWED,
846 .want_cm_reject_cause = GSM48_REJECT_PLMN_NOT_ALLOWED,
Holger Hans Peter Freyther1fd60632010-10-19 20:55:33 +0200847 },
Holger Hans Peter Freyther415cd2e2014-01-20 09:55:46 +0100848 {
849 /* deny by bsc rule */
850 .data = bss_lu,
851 .length = sizeof(bss_lu),
852 .result = -2,
853 .bsc_imsi_deny = "[0-9]*",
854 .contype = NAT_CON_TYPE_LU,
855 .nat_cm_reject_cause = GSM48_REJECT_PLMN_NOT_ALLOWED,
856 .nat_lu_reject_cause = GSM48_REJECT_PLMN_NOT_ALLOWED,
857 .bsc_cm_reject_cause = 0x42,
858 .bsc_lu_reject_cause = 0x23,
859 .want_lu_reject_cause = 0x23,
860 .want_cm_reject_cause = 0x42,
861 },
Holger Hans Peter Freyther34a96ae2010-05-14 19:49:35 +0800862};
863
Holger Hans Peter Freyther0c08db12010-05-14 08:12:57 +0800864static void test_cr_filter()
865{
Holger Hans Peter Freyther19c0a842010-05-16 02:00:40 +0800866 int i, res, contype;
Holger Hans Peter Freyther0c08db12010-05-14 08:12:57 +0800867 struct msgb *msg = msgb_alloc(4096, "test_cr_filter");
Holger Hans Peter Freyther0c08db12010-05-14 08:12:57 +0800868 struct bsc_nat_parsed *parsed;
Holger Hans Peter Freyther29c67032010-06-08 10:14:44 +0800869 struct bsc_nat_acc_lst *nat_lst, *bsc_lst;
Holger Hans Peter Freytherd77c8172010-06-08 10:53:39 +0800870 struct bsc_nat_acc_lst_entry *nat_entry, *bsc_entry;
Holger Hans Peter Freytherbdf764a2012-12-17 14:35:03 +0100871 struct bsc_nat_reject_cause cause;
Holger Hans Peter Freyther0c08db12010-05-14 08:12:57 +0800872
Holger Hans Peter Freyther34a96ae2010-05-14 19:49:35 +0800873 struct bsc_nat *nat = bsc_nat_alloc();
874 struct bsc_connection *bsc = bsc_connection_alloc(nat);
Holger Hans Peter Freyther0bd60f32010-10-08 22:08:29 +0800875 bsc->cfg = bsc_config_alloc(nat, "foo");
876 bsc_config_add_lac(bsc->cfg, 1234);
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +0800877 bsc->cfg->acc_lst_name = "bsc";
878 nat->acc_lst_name = "nat";
Holger Hans Peter Freyther34a96ae2010-05-14 19:49:35 +0800879
Holger Hans Peter Freytherd77c8172010-06-08 10:53:39 +0800880 nat_lst = bsc_nat_acc_lst_get(nat, "nat");
881 bsc_lst = bsc_nat_acc_lst_get(nat, "bsc");
882
883 bsc_entry = bsc_nat_acc_lst_entry_create(bsc_lst);
884 nat_entry = bsc_nat_acc_lst_entry_create(nat_lst);
885
Holger Hans Peter Freyther415cd2e2014-01-20 09:55:46 +0100886 /* test the default value as we are going to overwrite it */
887 OSMO_ASSERT(bsc_entry->cm_reject_cause == GSM48_REJECT_PLMN_NOT_ALLOWED);
888 OSMO_ASSERT(bsc_entry->lu_reject_cause == GSM48_REJECT_PLMN_NOT_ALLOWED);
889
Holger Hans Peter Freyther34a96ae2010-05-14 19:49:35 +0800890 for (i = 0; i < ARRAY_SIZE(cr_filter); ++i) {
Holger Hans Peter Freyther749497e2010-09-29 01:19:42 +0800891 char *imsi;
Holger Hans Peter Freyther34a96ae2010-05-14 19:49:35 +0800892 msgb_reset(msg);
893 copy_to_msg(msg, cr_filter[i].data, cr_filter[i].length);
894
Holger Hans Peter Freyther415cd2e2014-01-20 09:55:46 +0100895 bsc_entry->cm_reject_cause = cr_filter[i].bsc_cm_reject_cause;
896 bsc_entry->lu_reject_cause = cr_filter[i].bsc_lu_reject_cause;
897 nat_entry->cm_reject_cause = cr_filter[i].nat_cm_reject_cause;
898 nat_entry->lu_reject_cause = cr_filter[i].nat_lu_reject_cause;
899
Holger Hans Peter Freyther06c9da62011-06-09 21:48:49 +0200900 if (gsm_parse_reg(nat_entry, &nat_entry->imsi_deny_re, &nat_entry->imsi_deny,
Holger Hans Peter Freyther34a96ae2010-05-14 19:49:35 +0800901 cr_filter[i].nat_imsi_deny ? 1 : 0,
Holger Hans Peter Freyther4c9557e2011-04-04 19:19:26 +0200902 &cr_filter[i].nat_imsi_deny) != 0)
903 abort();
Holger Hans Peter Freyther06c9da62011-06-09 21:48:49 +0200904 if (gsm_parse_reg(bsc_entry, &bsc_entry->imsi_allow_re, &bsc_entry->imsi_allow,
Holger Hans Peter Freyther34a96ae2010-05-14 19:49:35 +0800905 cr_filter[i].bsc_imsi_allow ? 1 : 0,
Holger Hans Peter Freyther4c9557e2011-04-04 19:19:26 +0200906 &cr_filter[i].bsc_imsi_allow) != 0)
907 abort();
Holger Hans Peter Freyther06c9da62011-06-09 21:48:49 +0200908 if (gsm_parse_reg(bsc_entry, &bsc_entry->imsi_deny_re, &bsc_entry->imsi_deny,
Holger Hans Peter Freyther34a96ae2010-05-14 19:49:35 +0800909 cr_filter[i].bsc_imsi_deny ? 1 : 0,
Holger Hans Peter Freyther4c9557e2011-04-04 19:19:26 +0200910 &cr_filter[i].bsc_imsi_deny) != 0)
911 abort();
Holger Hans Peter Freyther34a96ae2010-05-14 19:49:35 +0800912
913 parsed = bsc_nat_parse(msg);
914 if (!parsed) {
Holger Hans Peter Freytherf5ede522012-01-06 13:56:12 +0100915 printf("FAIL: Failed to parse the message\n");
Holger Hans Peter Freyther34a96ae2010-05-14 19:49:35 +0800916 abort();
917 }
918
Holger Hans Peter Freytherbdf764a2012-12-17 14:35:03 +0100919 memset(&cause, 0, sizeof(cause));
920 res = bsc_nat_filter_sccp_cr(bsc, msg, parsed, &contype, &imsi, &cause);
Holger Hans Peter Freyther34a96ae2010-05-14 19:49:35 +0800921 if (res != cr_filter[i].result) {
Holger Hans Peter Freytherf5ede522012-01-06 13:56:12 +0100922 printf("FAIL: Wrong result %d for test %d.\n", res, i);
Holger Hans Peter Freyther34a96ae2010-05-14 19:49:35 +0800923 abort();
924 }
925
Holger Hans Peter Freyther415cd2e2014-01-20 09:55:46 +0100926
927 OSMO_ASSERT(cause.cm_reject_cause == cr_filter[i].want_cm_reject_cause);
928 OSMO_ASSERT(cause.lu_reject_cause == cr_filter[i].want_lu_reject_cause);
929
Holger Hans Peter Freyther19c0a842010-05-16 02:00:40 +0800930 if (contype != cr_filter[i].contype) {
Holger Hans Peter Freytherf5ede522012-01-06 13:56:12 +0100931 printf("FAIL: Wrong contype %d for test %d.\n", res, contype);
Holger Hans Peter Freyther19c0a842010-05-16 02:00:40 +0800932 abort();
933 }
934
Holger Hans Peter Freyther749497e2010-09-29 01:19:42 +0800935 talloc_steal(parsed, imsi);
Holger Hans Peter Freyther34a96ae2010-05-14 19:49:35 +0800936 talloc_free(parsed);
Holger Hans Peter Freyther0c08db12010-05-14 08:12:57 +0800937 }
938
Holger Hans Peter Freyther0c08db12010-05-14 08:12:57 +0800939 msgb_free(msg);
Holger Hans Peter Freyther3615a302013-06-25 12:03:36 +0200940 talloc_free(nat);
Holger Hans Peter Freyther0c08db12010-05-14 08:12:57 +0800941}
942
Holger Hans Peter Freyther32685402010-09-15 05:20:40 +0800943static void test_dt_filter()
944{
945 int i;
946 struct msgb *msg = msgb_alloc(4096, "test_dt_filter");
947 struct bsc_nat_parsed *parsed;
Holger Hans Peter Freytherbdf764a2012-12-17 14:35:03 +0100948 struct bsc_nat_reject_cause cause;
Holger Hans Peter Freyther32685402010-09-15 05:20:40 +0800949
950 struct bsc_nat *nat = bsc_nat_alloc();
951 struct bsc_connection *bsc = bsc_connection_alloc(nat);
Holger Hans Peter Freytherc279e392013-04-16 09:53:13 +0200952 struct nat_sccp_connection *con = talloc_zero(0, struct nat_sccp_connection);
Holger Hans Peter Freyther32685402010-09-15 05:20:40 +0800953
Holger Hans Peter Freyther0bd60f32010-10-08 22:08:29 +0800954 bsc->cfg = bsc_config_alloc(nat, "foo");
955 bsc_config_add_lac(bsc->cfg, 23);
Holger Hans Peter Freyther32685402010-09-15 05:20:40 +0800956 con->bsc = bsc;
957
958 msgb_reset(msg);
959 copy_to_msg(msg, id_resp, ARRAY_SIZE(id_resp));
960
961 parsed = bsc_nat_parse(msg);
962 if (!parsed) {
Holger Hans Peter Freytherf5ede522012-01-06 13:56:12 +0100963 printf("FAIL: Could not parse ID resp\n");
Holger Hans Peter Freyther32685402010-09-15 05:20:40 +0800964 abort();
965 }
966
967 if (parsed->bssap != BSSAP_MSG_DTAP) {
Holger Hans Peter Freytherf5ede522012-01-06 13:56:12 +0100968 printf("FAIL: It should be dtap\n");
Holger Hans Peter Freyther32685402010-09-15 05:20:40 +0800969 abort();
970 }
971
972 /* gsm_type is actually the size of the dtap */
973 if (parsed->gsm_type < msgb_l3len(msg) - 3) {
Holger Hans Peter Freytherf5ede522012-01-06 13:56:12 +0100974 printf("FAIL: Not enough space for the content\n");
Holger Hans Peter Freyther32685402010-09-15 05:20:40 +0800975 abort();
976 }
977
Holger Hans Peter Freytherbdf764a2012-12-17 14:35:03 +0100978 memset(&cause, 0, sizeof(cause));
979 if (bsc_nat_filter_dt(bsc, msg, con, parsed, &cause) != 1) {
Holger Hans Peter Freytherf5ede522012-01-06 13:56:12 +0100980 printf("FAIL: Should have passed..\n");
Holger Hans Peter Freyther32685402010-09-15 05:20:40 +0800981 abort();
982 }
983
984 /* just some basic length checking... */
985 for (i = ARRAY_SIZE(id_resp); i >= 0; --i) {
986 msgb_reset(msg);
987 copy_to_msg(msg, id_resp, ARRAY_SIZE(id_resp));
988
989 parsed = bsc_nat_parse(msg);
990 if (!parsed)
991 continue;
992
993 con->imsi_checked = 0;
Holger Hans Peter Freytherbdf764a2012-12-17 14:35:03 +0100994 memset(&cause, 0, sizeof(cause));
995 bsc_nat_filter_dt(bsc, msg, con, parsed, &cause);
Holger Hans Peter Freyther32685402010-09-15 05:20:40 +0800996 }
997}
998
Holger Hans Peter Freyther73bbf892010-10-21 14:46:57 +0200999static void test_setup_rewrite()
1000{
1001 struct msgb *msg = msgb_alloc(4096, "test_dt_filter");
1002 struct msgb *out;
1003 struct bsc_nat_parsed *parsed;
1004 const char *imsi = "27408000001234";
1005
1006 struct bsc_nat *nat = bsc_nat_alloc();
1007
1008 /* a fake list */
Pablo Neira Ayusoab46cf32011-05-07 13:11:20 +02001009 struct osmo_config_list entries;
1010 struct osmo_config_entry entry;
Holger Hans Peter Freyther73bbf892010-10-21 14:46:57 +02001011
1012 INIT_LLIST_HEAD(&entries.entry);
1013 entry.mcc = "274";
1014 entry.mnc = "08";
1015 entry.option = "^0([1-9])";
1016 entry.text = "0049";
1017 llist_add_tail(&entry.list, &entries.entry);
Holger Hans Peter Freyther9c205712011-05-27 17:14:15 +02001018 bsc_nat_num_rewr_entry_adapt(nat, &nat->num_rewr, &entries);
Holger Hans Peter Freyther73bbf892010-10-21 14:46:57 +02001019
1020 /* verify that nothing changed */
1021 msgb_reset(msg);
1022 copy_to_msg(msg, cc_setup_international, ARRAY_SIZE(cc_setup_international));
1023 parsed = bsc_nat_parse(msg);
1024 if (!parsed) {
Holger Hans Peter Freytherf5ede522012-01-06 13:56:12 +01001025 printf("FAIL: Could not parse ID resp\n");
Holger Hans Peter Freyther73bbf892010-10-21 14:46:57 +02001026 abort();
1027 }
1028
Holger Hans Peter Freytherdf8e6e92011-05-27 14:09:55 +02001029 out = bsc_nat_rewrite_msg(nat, msg, parsed, imsi);
Holger Hans Peter Freyther73bbf892010-10-21 14:46:57 +02001030 if (msg != out) {
Holger Hans Peter Freytherf5ede522012-01-06 13:56:12 +01001031 printf("FAIL: The message should not have been changed\n");
Holger Hans Peter Freyther73bbf892010-10-21 14:46:57 +02001032 abort();
1033 }
1034
Holger Hans Peter Freyther50be1a92012-01-10 22:31:39 +01001035 verify_msg(out, cc_setup_international, ARRAY_SIZE(cc_setup_international));
Holger Hans Peter Freyther73bbf892010-10-21 14:46:57 +02001036 talloc_free(parsed);
1037
1038 /* verify that something in the message changes */
1039 msgb_reset(msg);
1040 copy_to_msg(msg, cc_setup_national, ARRAY_SIZE(cc_setup_national));
1041 parsed = bsc_nat_parse(msg);
1042 if (!parsed) {
Holger Hans Peter Freytherf5ede522012-01-06 13:56:12 +01001043 printf("FAIL: Could not parse ID resp\n");
Holger Hans Peter Freyther73bbf892010-10-21 14:46:57 +02001044 abort();
1045 }
1046
Holger Hans Peter Freytherdf8e6e92011-05-27 14:09:55 +02001047 out = bsc_nat_rewrite_msg(nat, msg, parsed, imsi);
Holger Hans Peter Freyther73bbf892010-10-21 14:46:57 +02001048 if (!out) {
Holger Hans Peter Freytherf5ede522012-01-06 13:56:12 +01001049 printf("FAIL: A new message should be created.\n");
Holger Hans Peter Freyther73bbf892010-10-21 14:46:57 +02001050 abort();
1051 }
1052
1053 if (msg == out) {
Holger Hans Peter Freytherf5ede522012-01-06 13:56:12 +01001054 printf("FAIL: The message should have changed\n");
Holger Hans Peter Freyther73bbf892010-10-21 14:46:57 +02001055 abort();
1056 }
1057
Holger Hans Peter Freyther50be1a92012-01-10 22:31:39 +01001058 verify_msg(out, cc_setup_national_patched, ARRAY_SIZE(cc_setup_national_patched));
Holger Hans Peter Freyther73bbf892010-10-21 14:46:57 +02001059 msgb_free(out);
Holger Hans Peter Freyther74779c62010-10-28 15:27:00 +02001060
1061 /* Make sure that a wildcard is matching */
1062 entry.mnc = "*";
Holger Hans Peter Freyther9c205712011-05-27 17:14:15 +02001063 bsc_nat_num_rewr_entry_adapt(nat, &nat->num_rewr, &entries);
Holger Hans Peter Freyther74779c62010-10-28 15:27:00 +02001064 msg = msgb_alloc(4096, "test_dt_filter");
1065 copy_to_msg(msg, cc_setup_national, ARRAY_SIZE(cc_setup_national));
1066 parsed = bsc_nat_parse(msg);
1067 if (!parsed) {
Holger Hans Peter Freytherf5ede522012-01-06 13:56:12 +01001068 printf("FAIL: Could not parse ID resp\n");
Holger Hans Peter Freyther74779c62010-10-28 15:27:00 +02001069 abort();
1070 }
1071
Holger Hans Peter Freytherdf8e6e92011-05-27 14:09:55 +02001072 out = bsc_nat_rewrite_msg(nat, msg, parsed, imsi);
Holger Hans Peter Freyther74779c62010-10-28 15:27:00 +02001073 if (!out) {
Holger Hans Peter Freytherf5ede522012-01-06 13:56:12 +01001074 printf("FAIL: A new message should be created.\n");
Holger Hans Peter Freyther74779c62010-10-28 15:27:00 +02001075 abort();
1076 }
1077
1078 if (msg == out) {
Holger Hans Peter Freytherf5ede522012-01-06 13:56:12 +01001079 printf("FAIL: The message should have changed\n");
Holger Hans Peter Freyther74779c62010-10-28 15:27:00 +02001080 abort();
1081 }
1082
Holger Hans Peter Freyther50be1a92012-01-10 22:31:39 +01001083 verify_msg(out, cc_setup_national_patched, ARRAY_SIZE(cc_setup_national_patched));
Holger Hans Peter Freyther74779c62010-10-28 15:27:00 +02001084 msgb_free(out);
1085
1086 /* Make sure that a wildcard is matching */
1087 entry.mnc = "09";
Holger Hans Peter Freyther9c205712011-05-27 17:14:15 +02001088 bsc_nat_num_rewr_entry_adapt(nat, &nat->num_rewr, &entries);
Holger Hans Peter Freyther74779c62010-10-28 15:27:00 +02001089 msg = msgb_alloc(4096, "test_dt_filter");
1090 copy_to_msg(msg, cc_setup_national, ARRAY_SIZE(cc_setup_national));
1091 parsed = bsc_nat_parse(msg);
1092 if (!parsed) {
Holger Hans Peter Freytherf5ede522012-01-06 13:56:12 +01001093 printf("FAIL: Could not parse ID resp\n");
Holger Hans Peter Freyther74779c62010-10-28 15:27:00 +02001094 abort();
1095 }
1096
Holger Hans Peter Freytherdf8e6e92011-05-27 14:09:55 +02001097 out = bsc_nat_rewrite_msg(nat, msg, parsed, imsi);
Holger Hans Peter Freyther74779c62010-10-28 15:27:00 +02001098 if (out != msg) {
Holger Hans Peter Freytherf5ede522012-01-06 13:56:12 +01001099 printf("FAIL: The message should be unchanged.\n");
Holger Hans Peter Freyther74779c62010-10-28 15:27:00 +02001100 abort();
1101 }
1102
Holger Hans Peter Freyther50be1a92012-01-10 22:31:39 +01001103 verify_msg(out, cc_setup_national, ARRAY_SIZE(cc_setup_national));
Holger Hans Peter Freyther74779c62010-10-28 15:27:00 +02001104 msgb_free(out);
Holger Hans Peter Freytherdbd94492013-04-02 12:34:11 +02001105
1106 /* Now see what happens to an international number */
1107 entry.mnc = "*";
1108 entry.option = "^\\+[0-9][0-9]([1-9])";
1109 entry.text = "0036";
1110 bsc_nat_num_rewr_entry_adapt(nat, &nat->num_rewr, &entries);
1111 msg = msgb_alloc(4096, "test_dt_filter");
1112 copy_to_msg(msg, cc_setup_national_patched, ARRAY_SIZE(cc_setup_national_patched));
1113 parsed = bsc_nat_parse(msg);
1114 if (!parsed) {
1115 printf("FAIL: Could not parse ID resp %d\n", __LINE__);
1116 abort();
1117 }
1118
1119 out = bsc_nat_rewrite_msg(nat, msg, parsed, imsi);
1120 if (!out) {
1121 printf("FAIL: A new message should be created %d.\n", __LINE__);
1122 abort();
1123 }
1124
1125 if (msg == out) {
1126 printf("FAIL: The message should have changed %d\n", __LINE__);
1127 abort();
1128 }
1129
1130 verify_msg(out, cc_setup_national_patched_patched,
1131 ARRAY_SIZE(cc_setup_national_patched_patched));
1132 msgb_free(out);
1133
1134 /* go from international back to national */
1135 entry.mnc = "*";
1136 entry.option = "^\\+([0-9])";
1137 entry.text = "36";
1138 bsc_nat_num_rewr_entry_adapt(nat, &nat->num_rewr, &entries);
1139 msg = msgb_alloc(4096, "test_dt_filter");
1140 copy_to_msg(msg, cc_setup_national_patched, ARRAY_SIZE(cc_setup_national_patched));
1141 parsed = bsc_nat_parse(msg);
1142 if (!parsed) {
1143 printf("FAIL: Could not parse ID resp %d\n", __LINE__);
1144 abort();
1145 }
1146
1147 out = bsc_nat_rewrite_msg(nat, msg, parsed, imsi);
1148 if (!out) {
1149 printf("FAIL: A new message should be created %d.\n", __LINE__);
1150 abort();
1151 }
1152
1153 if (msg == out) {
1154 printf("FAIL: The message should have changed %d\n", __LINE__);
1155 abort();
1156 }
1157
1158 verify_msg(out, cc_setup_national_again,
1159 ARRAY_SIZE(cc_setup_national_again));
1160 msgb_free(out);
Holger Hans Peter Freyther3615a302013-06-25 12:03:36 +02001161 bsc_nat_num_rewr_entry_adapt(nat, &nat->num_rewr, NULL);
1162 talloc_free(nat);
Holger Hans Peter Freyther73bbf892010-10-21 14:46:57 +02001163}
1164
Holger Hans Peter Freytherddf191e2013-06-25 11:44:01 +02001165static void test_setup_rewrite_prefix(void)
1166{
1167 struct msgb *msg = msgb_alloc(4096, "test_dt_filter");
1168 struct msgb *out;
1169 struct bsc_nat_parsed *parsed;
1170 const char *imsi = "27408000001234";
1171
1172 struct bsc_nat *nat = bsc_nat_alloc();
1173
1174 /* a fake list */
1175 struct osmo_config_list entries;
1176 struct osmo_config_entry entry;
1177
1178 INIT_LLIST_HEAD(&entries.entry);
1179 entry.mcc = "274";
1180 entry.mnc = "08";
1181 entry.option = "^0([1-9])";
1182 entry.text = "prefix_lookup";
1183 llist_add_tail(&entry.list, &entries.entry);
1184 bsc_nat_num_rewr_entry_adapt(nat, &nat->num_rewr, &entries);
1185
1186 nat->num_rewr_trie = nat_rewrite_parse(nat, "prefixes.csv");
1187
1188 msgb_reset(msg);
1189 copy_to_msg(msg, cc_setup_national, ARRAY_SIZE(cc_setup_national));
1190 parsed = bsc_nat_parse(msg);
1191 if (!parsed) {
1192 printf("FAIL: Could not parse ID resp\n");
1193 abort();
1194 }
1195
1196 out = bsc_nat_rewrite_msg(nat, msg, parsed, imsi);
1197 if (!out) {
1198 printf("FAIL: A new message should be created.\n");
1199 abort();
1200 }
1201
1202 if (msg == out) {
1203 printf("FAIL: The message should have changed\n");
1204 abort();
1205 }
1206
1207 verify_msg(out, cc_setup_national_patched, ARRAY_SIZE(cc_setup_national_patched));
1208 msgb_free(out);
1209
1210 bsc_nat_num_rewr_entry_adapt(nat, &nat->num_rewr, NULL);
1211 talloc_free(nat);
1212}
1213
Holger Hans Peter Freyther67e423c2013-06-25 15:38:31 +02001214static void test_setup_rewrite_post(void)
1215{
1216 struct msgb *msg = msgb_alloc(4096, "test_dt_filter");
1217 struct msgb *out;
1218 struct bsc_nat_parsed *parsed;
1219 const char *imsi = "27408000001234";
1220
1221 struct bsc_nat *nat = bsc_nat_alloc();
1222
1223 /* a fake list */
1224 struct osmo_config_list entries;
1225 struct osmo_config_entry entry;
1226 struct osmo_config_list entries_post;
1227 struct osmo_config_entry entry_post;
1228
1229 INIT_LLIST_HEAD(&entries.entry);
1230 entry.mcc = "274";
1231 entry.mnc = "08";
1232 entry.option = "^0([1-9])";
1233 entry.text = "0049";
1234 llist_add_tail(&entry.list, &entries.entry);
1235 bsc_nat_num_rewr_entry_adapt(nat, &nat->num_rewr, &entries);
1236
1237 /* attempt to undo the previous one */
1238 INIT_LLIST_HEAD(&entries_post.entry);
1239 entry_post.mcc = "274";
1240 entry_post.mnc = "08";
1241 entry_post.option = "^\\+49([1-9])";
1242 entry_post.text = "prefix_lookup";
1243 llist_add_tail(&entry_post.list, &entries_post.entry);
1244 bsc_nat_num_rewr_entry_adapt(nat, &nat->num_rewr_post, &entries_post);
1245
1246 nat->num_rewr_trie = nat_rewrite_parse(nat, "prefixes.csv");
1247
1248 msgb_reset(msg);
1249 copy_to_msg(msg, cc_setup_national, ARRAY_SIZE(cc_setup_national));
1250 parsed = bsc_nat_parse(msg);
1251 if (!parsed) {
1252 printf("FAIL: Could not parse ID resp\n");
1253 abort();
1254 }
1255
1256 out = bsc_nat_rewrite_msg(nat, msg, parsed, imsi);
1257 if (!out) {
1258 printf("FAIL: A new message should be created.\n");
1259 abort();
1260 }
1261
1262 if (msg == out) {
1263 printf("FAIL: The message should have changed\n");
1264 abort();
1265 }
1266
1267 verify_msg(out, cc_setup_national, ARRAY_SIZE(cc_setup_national));
1268 msgb_free(out);
1269
1270 bsc_nat_num_rewr_entry_adapt(nat, &nat->num_rewr, NULL);
1271 talloc_free(nat);
1272}
1273
Holger Hans Peter Freyther8e60f622012-01-18 20:00:28 +01001274static void test_sms_smsc_rewrite()
Holger Hans Peter Freyther9c205712011-05-27 17:14:15 +02001275{
1276 struct msgb *msg = msgb_alloc(4096, "SMSC rewrite"), *out;
1277 struct bsc_nat_parsed *parsed;
1278 const char *imsi = "515039900406700";
1279
1280 struct bsc_nat *nat = bsc_nat_alloc();
1281
1282 /* a fake list */
Holger Hans Peter Freyther68368dd2012-01-10 22:39:07 +01001283 struct osmo_config_list smsc_entries, dest_entries, clear_entries;
1284 struct osmo_config_entry smsc_entry, dest_entry, clear_entry;
Holger Hans Peter Freyther9c205712011-05-27 17:14:15 +02001285
Holger Hans Peter Freytheracc40312011-05-27 19:21:24 +02001286 INIT_LLIST_HEAD(&smsc_entries.entry);
1287 INIT_LLIST_HEAD(&dest_entries.entry);
Holger Hans Peter Freyther68368dd2012-01-10 22:39:07 +01001288 INIT_LLIST_HEAD(&clear_entries.entry);
Holger Hans Peter Freytheracc40312011-05-27 19:21:24 +02001289 smsc_entry.mcc = "^515039";
1290 smsc_entry.option = "639180000105()";
1291 smsc_entry.text = "6666666666667";
1292 llist_add_tail(&smsc_entry.list, &smsc_entries.entry);
1293 dest_entry.mcc = "515";
1294 dest_entry.mnc = "03";
1295 dest_entry.option = "^0049";
1296 dest_entry.text = "";
1297 llist_add_tail(&dest_entry.list, &dest_entries.entry);
Holger Hans Peter Freyther68368dd2012-01-10 22:39:07 +01001298 clear_entry.mcc = "^515039";
1299 clear_entry.option = "^0049";
1300 clear_entry.text = "";
1301 llist_add_tail(&clear_entry.list, &clear_entries.entry);
Holger Hans Peter Freytheracc40312011-05-27 19:21:24 +02001302
1303 bsc_nat_num_rewr_entry_adapt(nat, &nat->smsc_rewr, &smsc_entries);
1304 bsc_nat_num_rewr_entry_adapt(nat, &nat->tpdest_match, &dest_entries);
Holger Hans Peter Freyther68368dd2012-01-10 22:39:07 +01001305 bsc_nat_num_rewr_entry_adapt(nat, &nat->sms_clear_tp_srr, &clear_entries);
Holger Hans Peter Freyther9c205712011-05-27 17:14:15 +02001306
Holger Hans Peter Freyther68368dd2012-01-10 22:39:07 +01001307 printf("Testing SMSC rewriting.\n");
1308
1309 /*
1310 * Check if the SMSC address is changed
1311 */
Holger Hans Peter Freyther9c205712011-05-27 17:14:15 +02001312 copy_to_msg(msg, smsc_rewrite, ARRAY_SIZE(smsc_rewrite));
1313 parsed = bsc_nat_parse(msg);
1314 if (!parsed) {
Holger Hans Peter Freytherf5ede522012-01-06 13:56:12 +01001315 printf("FAIL: Could not parse SMS\n");
Holger Hans Peter Freyther9c205712011-05-27 17:14:15 +02001316 abort();
1317 }
1318
1319 out = bsc_nat_rewrite_msg(nat, msg, parsed, imsi);
1320 if (out == msg) {
Holger Hans Peter Freytherf5ede522012-01-06 13:56:12 +01001321 printf("FAIL: This should have changed.\n");
Holger Hans Peter Freyther9c205712011-05-27 17:14:15 +02001322 abort();
1323 }
1324
Holger Hans Peter Freyther50be1a92012-01-10 22:31:39 +01001325 verify_msg(out, smsc_rewrite_patched, ARRAY_SIZE(smsc_rewrite_patched));
1326 msgb_free(out);
Holger Hans Peter Freyther68368dd2012-01-10 22:39:07 +01001327
1328 /* clear out the filter for SMSC */
1329 printf("Attempting to only rewrite the HDR\n");
1330 bsc_nat_num_rewr_entry_adapt(nat, &nat->smsc_rewr, NULL);
1331 msg = msgb_alloc(4096, "SMSC rewrite");
1332 copy_to_msg(msg, smsc_rewrite, ARRAY_SIZE(smsc_rewrite));
1333 parsed = bsc_nat_parse(msg);
1334 if (!parsed) {
1335 printf("FAIL: Could not parse SMS\n");
1336 abort();
1337 }
1338
1339 out = bsc_nat_rewrite_msg(nat, msg, parsed, imsi);
1340 if (out == msg) {
1341 printf("FAIL: This should have changed.\n");
1342 abort();
1343 }
1344
1345 verify_msg(out, smsc_rewrite_patched_hdr, ARRAY_SIZE(smsc_rewrite_patched_hdr));
1346 msgb_free(out);
1347
1348 /* clear out the next filter */
1349 printf("Attempting to change nothing.\n");
1350 bsc_nat_num_rewr_entry_adapt(nat, &nat->sms_clear_tp_srr, NULL);
1351 msg = msgb_alloc(4096, "SMSC rewrite");
1352 copy_to_msg(msg, smsc_rewrite, ARRAY_SIZE(smsc_rewrite));
1353 parsed = bsc_nat_parse(msg);
1354 if (!parsed) {
1355 printf("FAIL: Could not parse SMS\n");
1356 abort();
1357 }
1358
1359 out = bsc_nat_rewrite_msg(nat, msg, parsed, imsi);
1360 if (out != msg) {
1361 printf("FAIL: This should not have changed.\n");
1362 abort();
1363 }
1364
1365 verify_msg(out, smsc_rewrite, ARRAY_SIZE(smsc_rewrite));
1366 msgb_free(out);
Holger Hans Peter Freyther9c205712011-05-27 17:14:15 +02001367}
1368
Holger Hans Peter Freyther8e60f622012-01-18 20:00:28 +01001369static void test_sms_number_rewrite(void)
1370{
Holger Hans Peter Freyther09db1a42012-03-26 16:21:42 +02001371 struct msgb *msg, *out;
Holger Hans Peter Freyther8e60f622012-01-18 20:00:28 +01001372 struct bsc_nat_parsed *parsed;
1373 const char *imsi = "515039900406700";
1374
1375 struct bsc_nat *nat = bsc_nat_alloc();
1376
1377 /* a fake list */
Holger Hans Peter Freyther09db1a42012-03-26 16:21:42 +02001378 struct osmo_config_list num_entries, clear_entries;
1379 struct osmo_config_entry num_entry, clear_entry;
Holger Hans Peter Freyther8e60f622012-01-18 20:00:28 +01001380
1381 INIT_LLIST_HEAD(&num_entries.entry);
1382 num_entry.mcc = "^515039";
1383 num_entry.option = "^0049()";
1384 num_entry.text = "0032";
1385 llist_add_tail(&num_entry.list, &num_entries.entry);
1386
1387 bsc_nat_num_rewr_entry_adapt(nat, &nat->sms_num_rewr, &num_entries);
1388
1389 printf("Testing SMS TP-DA rewriting.\n");
1390
1391 /*
1392 * Check if the SMSC address is changed
1393 */
Holger Hans Peter Freyther09db1a42012-03-26 16:21:42 +02001394 msg = msgb_alloc(4096, "SMSC rewrite");
Holger Hans Peter Freyther8e60f622012-01-18 20:00:28 +01001395 copy_to_msg(msg, smsc_rewrite, ARRAY_SIZE(smsc_rewrite));
1396 parsed = bsc_nat_parse(msg);
1397 if (!parsed) {
1398 printf("FAIL: Could not parse SMS\n");
1399 abort();
1400 }
1401
1402 out = bsc_nat_rewrite_msg(nat, msg, parsed, imsi);
1403 if (out == msg) {
1404 printf("FAIL: This should have changed.\n");
1405 abort();
1406 }
1407
1408 verify_msg(out, smsc_rewrite_num_patched,
1409 ARRAY_SIZE(smsc_rewrite_num_patched));
1410 msgb_free(out);
Holger Hans Peter Freyther09db1a42012-03-26 16:21:42 +02001411
1412 /*
1413 * Now with TP-SRR rewriting enabled
1414 */
1415 INIT_LLIST_HEAD(&clear_entries.entry);
1416 clear_entry.mcc = "^515039";
1417 clear_entry.option = "";
1418 clear_entry.text = "";
1419 llist_add_tail(&clear_entry.list, &clear_entries.entry);
1420 bsc_nat_num_rewr_entry_adapt(nat, &nat->sms_clear_tp_srr, &clear_entries);
1421
1422 msg = msgb_alloc(4096, "SMSC rewrite");
1423 copy_to_msg(msg, smsc_rewrite, ARRAY_SIZE(smsc_rewrite));
1424 parsed = bsc_nat_parse(msg);
1425 if (!parsed) {
1426 printf("FAIL: Could not parse SMS\n");
1427 abort();
1428 }
1429
1430 out = bsc_nat_rewrite_msg(nat, msg, parsed, imsi);
1431 if (out == msg) {
1432 printf("FAIL: This should have changed.\n");
1433 abort();
1434 }
1435
1436 verify_msg(out, smsc_rewrite_num_patched_tp_srr,
1437 ARRAY_SIZE(smsc_rewrite_num_patched_tp_srr));
1438 msgb_free(out);
Holger Hans Peter Freyther8e60f622012-01-18 20:00:28 +01001439}
1440
Holger Hans Peter Freyther1f8276e2013-01-01 11:25:09 +01001441static void test_barr_list_parsing(void)
1442{
1443 int rc;
1444 int cm, lu;
1445 struct rb_node *node;
1446 struct rb_root root = RB_ROOT;
1447 struct osmo_config_list *lst = osmo_config_list_parse(NULL, "barr.cfg");
1448 if (lst == NULL)
1449 abort();
1450
1451 rc = bsc_nat_barr_adapt(NULL, &root, lst);
1452 if (rc != 0)
1453 abort();
1454 talloc_free(lst);
1455
1456
1457 for (node = rb_first(&root); node; node = rb_next(node)) {
1458 struct bsc_nat_barr_entry *entry;
1459 entry = rb_entry(node, struct bsc_nat_barr_entry, node);
1460 printf("IMSI: %s CM: %d LU: %d\n", entry->imsi,
1461 entry->cm_reject_cause, entry->lu_reject_cause);
1462 }
1463
1464 /* do the look up now.. */
1465 rc = bsc_nat_barr_find(&root, "12123119", &cm, &lu);
1466 if (!rc) {
1467 printf("Failed to find the IMSI.\n");
1468 abort();
1469 }
1470
1471 if (cm != 3 || lu != 4) {
1472 printf("Found CM(%d) and LU(%d)\n", cm, lu);
1473 abort();
1474 }
1475
1476 /* empty and check that it is empty */
1477 bsc_nat_barr_adapt(NULL, &root, NULL);
1478 if (!RB_EMPTY_ROOT(&root)) {
1479 printf("Failed to empty the list.\n");
1480 abort();
1481 }
1482
1483 /* check that dup results in an error */
1484 lst = osmo_config_list_parse(NULL, "barr_dup.cfg");
1485 if (lst == NULL) {
1486 printf("Failed to parse list with dups\n");
1487 abort();
1488 }
1489
1490 rc = bsc_nat_barr_adapt(NULL, &root, lst);
1491 if (rc != -1) {
1492 printf("It should have failed due dup\n");
1493 abort();
1494 }
1495 talloc_free(lst);
1496
1497 /* dump for reference */
1498 for (node = rb_first(&root); node; node = rb_next(node)) {
1499 struct bsc_nat_barr_entry *entry;
1500 entry = rb_entry(node, struct bsc_nat_barr_entry, node);
1501 printf("IMSI: %s CM: %d LU: %d\n", entry->imsi,
1502 entry->cm_reject_cause, entry->lu_reject_cause);
1503
1504 }
1505}
1506
Holger Hans Peter Freytherb2b291d2013-04-16 13:23:43 +02001507static void test_nat_extract_lac()
1508{
1509 int res;
1510 struct bsc_connection *bsc;
1511 struct bsc_nat *nat;
1512 struct nat_sccp_connection con;
1513 struct bsc_nat_parsed *parsed;
1514 struct msgb *msg = msgb_alloc(4096, "test-message");
1515
1516 printf("Testing LAC extraction from SCCP CR\n");
1517
1518 /* initialize the testcase */
1519 nat = bsc_nat_alloc();
1520 bsc = bsc_connection_alloc(nat);
1521 bsc->cfg = bsc_config_alloc(nat, "foo");
1522
1523 memset(&con, 0, sizeof(con));
1524 con.bsc = bsc;
1525
1526 /* create the SCCP CR */
1527 msg->l2h = msgb_put(msg, ARRAY_SIZE(bssmap_cr));
1528 memcpy(msg->l2h, bssmap_cr, ARRAY_SIZE(bssmap_cr));
1529
1530 /* parse it and pass it on */
1531 parsed = bsc_nat_parse(msg);
1532 res = bsc_nat_extract_lac(bsc, &con, parsed, msg);
1533 OSMO_ASSERT(res == 0);
1534
1535 /* verify the LAC */
1536 OSMO_ASSERT(con.lac == 8210);
1537 OSMO_ASSERT(con.ci == 50000);
1538}
1539
Holger Hans Peter Freyther38f7c752010-06-15 18:48:36 +08001540int main(int argc, char **argv)
1541{
Holger Hans Peter Freyther30e1ae92010-07-30 02:53:14 +08001542 sccp_set_log_area(DSCCP);
Holger Hans Peter Freyther67cd75f2011-05-12 16:02:07 +02001543 osmo_init_logging(&log_info);
Holger Hans Peter Freyther38f7c752010-06-15 18:48:36 +08001544
1545 test_filter();
Holger Hans Peter Freyther04fd9922010-03-30 06:51:53 +02001546 test_contrack();
Holger Hans Peter Freyther04fd9922010-03-30 06:51:53 +02001547 test_paging();
Holger Hans Peter Freytherfc9bd232010-04-01 03:55:27 +02001548 test_mgcp_ass_tracking();
1549 test_mgcp_find();
Holger Hans Peter Freyther76c83542010-04-01 06:48:52 +02001550 test_mgcp_rewrite();
Holger Hans Peter Freyther3c3bce12010-04-01 10:16:28 +02001551 test_mgcp_parse();
Holger Hans Peter Freyther0c08db12010-05-14 08:12:57 +08001552 test_cr_filter();
Holger Hans Peter Freyther32685402010-09-15 05:20:40 +08001553 test_dt_filter();
Holger Hans Peter Freyther73bbf892010-10-21 14:46:57 +02001554 test_setup_rewrite();
Holger Hans Peter Freytherddf191e2013-06-25 11:44:01 +02001555 test_setup_rewrite_prefix();
Holger Hans Peter Freyther67e423c2013-06-25 15:38:31 +02001556 test_setup_rewrite_post();
Holger Hans Peter Freyther8e60f622012-01-18 20:00:28 +01001557 test_sms_smsc_rewrite();
1558 test_sms_number_rewrite();
Holger Hans Peter Freythera9e93312011-02-26 11:38:00 +01001559 test_mgcp_allocations();
Holger Hans Peter Freyther1f8276e2013-01-01 11:25:09 +01001560 test_barr_list_parsing();
Holger Hans Peter Freytherb2b291d2013-04-16 13:23:43 +02001561 test_nat_extract_lac();
Holger Hans Peter Freytherf5ede522012-01-06 13:56:12 +01001562
1563 printf("Testing execution completed.\n");
Holger Hans Peter Freyther0b8f69d2010-06-15 18:45:38 +08001564 return 0;
1565}
Holger Hans Peter Freytherc3271872012-11-05 14:54:56 +01001566
1567/* stub */
1568void bsc_nat_send_mgcp_to_msc(struct bsc_nat *nat, struct msgb *msg)
1569{
1570 abort();
1571}