blob: 3e943cfe55096ffa7d769dcf11855f00e6a11b83 [file] [log] [blame]
Holger Hans Peter Freyther0b8f69d2010-06-15 18:45:38 +08001/*
2 * BSC NAT Message filtering
3 *
4 * (C) 2010 by Holger Hans Peter Freyther <zecke@selfish.org>
Holger Hans Peter Freytherdf6143a2010-06-15 18:46:56 +08005 * (C) 2010 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 Freyther0b8f69d2010-06-15 18:45:38 +080029
Holger Hans Peter Freyther38f7c752010-06-15 18:48:36 +080030#include <osmocore/talloc.h>
31
Harald Welted5db12c2010-08-03 15:11:51 +020032#include <osmocom/sccp/sccp.h>
Holger Hans Peter Freyther32685402010-09-15 05:20:40 +080033#include <osmocore/protocol/gsm_08_08.h>
Holger Hans Peter Freyther30e1ae92010-07-30 02:53:14 +080034
Holger Hans Peter Freyther0b8f69d2010-06-15 18:45:38 +080035#include <stdio.h>
36
37/* test messages for ipa */
Holger Hans Peter Freytherdbd16fe2010-07-23 19:08:55 +080038static uint8_t ipa_id[] = {
Holger Hans Peter Freyther0b8f69d2010-06-15 18:45:38 +080039 0x00, 0x01, 0xfe, 0x06,
40};
41
42/* SCCP messages are below */
Holger Hans Peter Freytherdbd16fe2010-07-23 19:08:55 +080043static uint8_t gsm_reset[] = {
Holger Hans Peter Freyther0b8f69d2010-06-15 18:45:38 +080044 0x00, 0x12, 0xfd,
45 0x09, 0x00, 0x03, 0x05, 0x07, 0x02, 0x42, 0xfe,
46 0x02, 0x42, 0xfe, 0x06, 0x00, 0x04, 0x30, 0x04,
47 0x01, 0x20,
48};
49
Holger Hans Peter Freytherdbd16fe2010-07-23 19:08:55 +080050static const uint8_t gsm_reset_ack[] = {
Holger Hans Peter Freyther0b8f69d2010-06-15 18:45:38 +080051 0x00, 0x13, 0xfd,
52 0x09, 0x00, 0x03, 0x07, 0x0b, 0x04, 0x43, 0x01,
53 0x00, 0xfe, 0x04, 0x43, 0x5c, 0x00, 0xfe, 0x03,
54 0x00, 0x01, 0x31,
55};
56
Holger Hans Peter Freytherdbd16fe2010-07-23 19:08:55 +080057static const uint8_t gsm_paging[] = {
Holger Hans Peter Freyther0b8f69d2010-06-15 18:45:38 +080058 0x00, 0x20, 0xfd,
59 0x09, 0x00, 0x03, 0x07, 0x0b, 0x04, 0x43, 0x01,
60 0x00, 0xfe, 0x04, 0x43, 0x5c, 0x00, 0xfe, 0x10,
61 0x00, 0x0e, 0x52, 0x08, 0x08, 0x29, 0x47, 0x10,
62 0x02, 0x01, 0x31, 0x97, 0x61, 0x1a, 0x01, 0x06,
63};
64
65/* BSC -> MSC connection open */
Holger Hans Peter Freytherdbd16fe2010-07-23 19:08:55 +080066static const uint8_t bssmap_cr[] = {
Holger Hans Peter Freyther0b8f69d2010-06-15 18:45:38 +080067 0x00, 0x2c, 0xfd,
68 0x01, 0x01, 0x02, 0x03, 0x02, 0x02, 0x04, 0x02,
69 0x42, 0xfe, 0x0f, 0x1f, 0x00, 0x1d, 0x57, 0x05,
70 0x08, 0x00, 0x72, 0xf4, 0x80, 0x20, 0x12, 0xc3,
71 0x50, 0x17, 0x10, 0x05, 0x24, 0x11, 0x03, 0x33,
72 0x19, 0xa2, 0x08, 0x29, 0x47, 0x10, 0x02, 0x01,
73 0x31, 0x97, 0x61, 0x00
74};
75
76/* MSC -> BSC connection confirm */
Holger Hans Peter Freytherdbd16fe2010-07-23 19:08:55 +080077static const uint8_t bssmap_cc[] = {
Holger Hans Peter Freyther0b8f69d2010-06-15 18:45:38 +080078 0x00, 0x0a, 0xfd,
79 0x02, 0x01, 0x02, 0x03, 0x00, 0x00, 0x03, 0x02, 0x01, 0x00,
80};
81
82/* MSC -> BSC released */
Holger Hans Peter Freytherdbd16fe2010-07-23 19:08:55 +080083static const uint8_t bssmap_released[] = {
Holger Hans Peter Freyther0b8f69d2010-06-15 18:45:38 +080084 0x00, 0x0e, 0xfd,
85 0x04, 0x00, 0x00, 0x03, 0x01, 0x02, 0x03, 0x00, 0x01, 0x0f,
86 0x02, 0x23, 0x42, 0x00,
87};
88
89/* BSC -> MSC released */
Holger Hans Peter Freytherdbd16fe2010-07-23 19:08:55 +080090static const uint8_t bssmap_release_complete[] = {
Holger Hans Peter Freyther0b8f69d2010-06-15 18:45:38 +080091 0x00, 0x07, 0xfd,
92 0x05, 0x01, 0x02, 0x03, 0x00, 0x00, 0x03
93};
94
Holger Hans Peter Freyther0a6f62f2010-04-06 10:22:01 +020095/* both directions IT timer */
Holger Hans Peter Freytherdbd16fe2010-07-23 19:08:55 +080096static const uint8_t connnection_it[] = {
Holger Hans Peter Freyther0a6f62f2010-04-06 10:22:01 +020097 0x00, 0x0b, 0xfd,
98 0x10, 0x01, 0x02, 0x03, 0x01, 0x02, 0x03,
99 0x00, 0x00, 0x00, 0x00,
100};
101
Holger Hans Peter Freyther5e63f922010-04-21 15:45:26 +0800102/* error in both directions */
Holger Hans Peter Freytherdbd16fe2010-07-23 19:08:55 +0800103static const uint8_t proto_error[] = {
Holger Hans Peter Freyther5e63f922010-04-21 15:45:26 +0800104 0x00, 0x05, 0xfd,
105 0x0f, 0x22, 0x33, 0x44, 0x00,
106};
107
Holger Hans Peter Freythera128d912010-04-01 08:47:12 +0200108/* MGCP wrap... */
Holger Hans Peter Freytherdbd16fe2010-07-23 19:08:55 +0800109static const uint8_t mgcp_msg[] = {
Holger Hans Peter Freythera128d912010-04-01 08:47:12 +0200110 0x00, 0x03, 0xfc,
111 0x20, 0x20, 0x20,
112};
113
Holger Hans Peter Freyther34a96ae2010-05-14 19:49:35 +0800114/* location updating request */
Holger Hans Peter Freytherdbd16fe2010-07-23 19:08:55 +0800115static const uint8_t bss_lu[] = {
Holger Hans Peter Freyther34a96ae2010-05-14 19:49:35 +0800116 0x00, 0x2e, 0xfd,
117 0x01, 0x91, 0x45, 0x14, 0x02, 0x02, 0x04, 0x02,
118 0x42, 0xfe, 0x0f, 0x21, 0x00, 0x1f, 0x57, 0x05,
119 0x08, 0x00, 0x72, 0xf4, 0x80, 0x20, 0x14, 0xc3,
120 0x50, 0x17, 0x12, 0x05, 0x08, 0x70, 0x72, 0xf4,
121 0x80, 0xff, 0xfe, 0x30, 0x08, 0x29, 0x44, 0x50,
122 0x12, 0x03, 0x24, 0x01, 0x95, 0x00
123};
124
Holger Hans Peter Freytherf1924982010-05-15 23:54:04 +0800125/* paging response */
126static const uint8_t pag_resp[] = {
127 0x00, 0x2c, 0xfd, 0x01, 0xe5, 0x68,
128 0x14, 0x02, 0x02, 0x04, 0x02, 0x42, 0xfe, 0x0f,
129 0x1f, 0x00, 0x1d, 0x57, 0x05, 0x08, 0x00, 0x72,
130 0xf4, 0x80, 0x20, 0x16, 0xc3, 0x50, 0x17, 0x10,
131 0x06, 0x27, 0x01, 0x03, 0x30, 0x18, 0x96, 0x08,
132 0x29, 0x26, 0x30, 0x32, 0x11, 0x42, 0x01, 0x19,
133 0x00
134};
135
Holger Hans Peter Freyther0b8f69d2010-06-15 18:45:38 +0800136struct filter_result {
Holger Hans Peter Freytherdbd16fe2010-07-23 19:08:55 +0800137 const uint8_t *data;
Holger Hans Peter Freythere2c15202010-07-23 19:09:21 +0800138 const uint16_t length;
Holger Hans Peter Freyther1d6fb182010-01-30 11:53:30 +0100139 const int dir;
Holger Hans Peter Freyther0b8f69d2010-06-15 18:45:38 +0800140 const int result;
141};
142
143static const struct filter_result results[] = {
144 {
145 .data = ipa_id,
146 .length = ARRAY_SIZE(ipa_id),
Holger Hans Peter Freyther1d6fb182010-01-30 11:53:30 +0100147 .dir = DIR_MSC,
148 .result = 1,
Holger Hans Peter Freyther0b8f69d2010-06-15 18:45:38 +0800149 },
150 {
151 .data = gsm_reset,
152 .length = ARRAY_SIZE(gsm_reset),
Holger Hans Peter Freyther1d6fb182010-01-30 11:53:30 +0100153 .dir = DIR_MSC,
154 .result = 1,
Holger Hans Peter Freyther0b8f69d2010-06-15 18:45:38 +0800155 },
156 {
157 .data = gsm_reset_ack,
158 .length = ARRAY_SIZE(gsm_reset_ack),
Holger Hans Peter Freyther1d6fb182010-01-30 11:53:30 +0100159 .dir = DIR_BSC,
160 .result = 1,
Holger Hans Peter Freyther0b8f69d2010-06-15 18:45:38 +0800161 },
162 {
163 .data = gsm_paging,
164 .length = ARRAY_SIZE(gsm_paging),
Holger Hans Peter Freyther1d6fb182010-01-30 11:53:30 +0100165 .dir = DIR_BSC,
166 .result = 0,
Holger Hans Peter Freyther0b8f69d2010-06-15 18:45:38 +0800167 },
168 {
169 .data = bssmap_cr,
170 .length = ARRAY_SIZE(bssmap_cr),
Holger Hans Peter Freyther1d6fb182010-01-30 11:53:30 +0100171 .dir = DIR_MSC,
172 .result = 0,
Holger Hans Peter Freyther0b8f69d2010-06-15 18:45:38 +0800173 },
174 {
175 .data = bssmap_cc,
176 .length = ARRAY_SIZE(bssmap_cc),
Holger Hans Peter Freyther1d6fb182010-01-30 11:53:30 +0100177 .dir = DIR_BSC,
178 .result = 0,
Holger Hans Peter Freyther0b8f69d2010-06-15 18:45:38 +0800179 },
180 {
181 .data = bssmap_released,
182 .length = ARRAY_SIZE(bssmap_released),
Holger Hans Peter Freyther1d6fb182010-01-30 11:53:30 +0100183 .dir = DIR_MSC,
184 .result = 0,
Holger Hans Peter Freyther0b8f69d2010-06-15 18:45:38 +0800185 },
186 {
187 .data = bssmap_release_complete,
188 .length = ARRAY_SIZE(bssmap_release_complete),
Holger Hans Peter Freyther1d6fb182010-01-30 11:53:30 +0100189 .dir = DIR_BSC,
190 .result = 0,
Holger Hans Peter Freyther0b8f69d2010-06-15 18:45:38 +0800191 },
Holger Hans Peter Freythera128d912010-04-01 08:47:12 +0200192 {
193 .data = mgcp_msg,
194 .length = ARRAY_SIZE(mgcp_msg),
195 .dir = DIR_MSC,
196 .result = 0,
197 },
Holger Hans Peter Freyther0a6f62f2010-04-06 10:22:01 +0200198 {
199 .data = connnection_it,
200 .length = ARRAY_SIZE(connnection_it),
201 .dir = DIR_BSC,
202 .result = 0,
203 },
204 {
205 .data = connnection_it,
206 .length = ARRAY_SIZE(connnection_it),
207 .dir = DIR_MSC,
208 .result = 0,
209 },
Holger Hans Peter Freyther5e63f922010-04-21 15:45:26 +0800210 {
211 .data = proto_error,
212 .length = ARRAY_SIZE(proto_error),
213 .dir = DIR_BSC,
214 .result = 0,
215 },
216 {
217 .data = proto_error,
218 .length = ARRAY_SIZE(proto_error),
219 .dir = DIR_MSC,
220 .result = 0,
221 },
222
Holger Hans Peter Freyther0b8f69d2010-06-15 18:45:38 +0800223};
224
Holger Hans Peter Freyther38f7c752010-06-15 18:48:36 +0800225static void test_filter(void)
Holger Hans Peter Freyther0b8f69d2010-06-15 18:45:38 +0800226{
227 int i;
228
229
230 /* start testinh with proper messages */
Holger Hans Peter Freyther38f7c752010-06-15 18:48:36 +0800231 fprintf(stderr, "Testing BSS Filtering.\n");
Holger Hans Peter Freyther0b8f69d2010-06-15 18:45:38 +0800232 for (i = 0; i < ARRAY_SIZE(results); ++i) {
233 int result;
234 struct bsc_nat_parsed *parsed;
235 struct msgb *msg = msgb_alloc(4096, "test-message");
236
237 fprintf(stderr, "Going to test item: %d\n", i);
238 memcpy(msg->data, results[i].data, results[i].length);
239 msg->l2h = msgb_put(msg, results[i].length);
240
241 parsed = bsc_nat_parse(msg);
242 if (!parsed) {
243 fprintf(stderr, "FAIL: Failed to parse the message\n");
244 continue;
245 }
246
Holger Hans Peter Freyther1d6fb182010-01-30 11:53:30 +0100247 result = bsc_nat_filter_ipa(results[i].dir, msg, parsed);
Holger Hans Peter Freyther0b8f69d2010-06-15 18:45:38 +0800248 if (result != results[i].result) {
249 fprintf(stderr, "FAIL: Not the expected result got: %d wanted: %d\n",
250 result, results[i].result);
251 }
252
253 msgb_free(msg);
254 }
Holger Hans Peter Freyther38f7c752010-06-15 18:48:36 +0800255}
Holger Hans Peter Freyther0b8f69d2010-06-15 18:45:38 +0800256
Holger Hans Peter Freyther38f7c752010-06-15 18:48:36 +0800257#include "bsc_data.c"
258
Holger Hans Peter Freytherdbd16fe2010-07-23 19:08:55 +0800259static void copy_to_msg(struct msgb *msg, const uint8_t *data, unsigned int length)
Holger Hans Peter Freyther38f7c752010-06-15 18:48:36 +0800260{
261 msgb_reset(msg);
262 msg->l2h = msgb_put(msg, length);
263 memcpy(msg->l2h, data, msgb_l2len(msg));
264}
265
266#define VERIFY(con_found, con, msg, ver, str) \
Holger Hans Peter Freyther49c7fb52010-06-15 18:48:55 +0800267 if (!con_found || con_found->bsc != con) { \
Holger Hans Peter Freyther72ba1622010-06-15 18:48:44 +0800268 fprintf(stderr, "Failed to find the con: %p\n", con_found); \
Holger Hans Peter Freyther38f7c752010-06-15 18:48:36 +0800269 abort(); \
270 } \
271 if (memcmp(msg->data, ver, sizeof(ver)) != 0) { \
272 fprintf(stderr, "Failed to patch the %s msg.\n", str); \
273 abort(); \
274 }
275
276/* test conn tracking once */
277static void test_contrack()
278{
Holger Hans Peter Freyther38f7c752010-06-15 18:48:36 +0800279 struct bsc_nat *nat;
Holger Hans Peter Freyther49c7fb52010-06-15 18:48:55 +0800280 struct bsc_connection *con;
281 struct sccp_connections *con_found;
Holger Hans Peter Freytherfa20c942010-05-16 16:51:31 +0800282 struct sccp_connections *rc_con;
Holger Hans Peter Freyther38f7c752010-06-15 18:48:36 +0800283 struct bsc_nat_parsed *parsed;
284 struct msgb *msg;
285
286 fprintf(stderr, "Testing connection tracking.\n");
287 nat = bsc_nat_alloc();
288 con = bsc_connection_alloc(nat);
Holger Hans Peter Freyther0bd60f32010-10-08 22:08:29 +0800289 con->cfg = bsc_config_alloc(nat, "foo");
290 bsc_config_add_lac(con->cfg, 23);
291 bsc_config_add_lac(con->cfg, 49);
292 bsc_config_add_lac(con->cfg, 42);
293 bsc_config_del_lac(con->cfg, 49);
294 bsc_config_add_lac(con->cfg, 1111);
Holger Hans Peter Freyther38f7c752010-06-15 18:48:36 +0800295 msg = msgb_alloc(4096, "test");
296
297 /* 1.) create a connection */
298 copy_to_msg(msg, bsc_cr, sizeof(bsc_cr));
299 parsed = bsc_nat_parse(msg);
Holger Hans Peter Freytherb5513ca2010-04-21 18:56:12 +0800300 con_found = patch_sccp_src_ref_to_msc(msg, parsed, con);
Holger Hans Peter Freyther38f7c752010-06-15 18:48:36 +0800301 if (con_found != NULL) {
Holger Hans Peter Freyther72ba1622010-06-15 18:48:44 +0800302 fprintf(stderr, "Con should not exist %p\n", con_found);
Holger Hans Peter Freyther38f7c752010-06-15 18:48:36 +0800303 abort();
304 }
Holger Hans Peter Freytherfa20c942010-05-16 16:51:31 +0800305 rc_con = create_sccp_src_ref(con, parsed);
306 if (!rc_con) {
Holger Hans Peter Freyther38f7c752010-06-15 18:48:36 +0800307 fprintf(stderr, "Failed to create a ref\n");
308 abort();
309 }
Holger Hans Peter Freytherb5513ca2010-04-21 18:56:12 +0800310 con_found = patch_sccp_src_ref_to_msc(msg, parsed, con);
Holger Hans Peter Freyther49c7fb52010-06-15 18:48:55 +0800311 if (!con_found || con_found->bsc != con) {
Holger Hans Peter Freyther72ba1622010-06-15 18:48:44 +0800312 fprintf(stderr, "Failed to find the con: %p\n", con_found);
Holger Hans Peter Freyther38f7c752010-06-15 18:48:36 +0800313 abort();
314 }
Holger Hans Peter Freytherfa20c942010-05-16 16:51:31 +0800315 if (con_found != rc_con) {
316 fprintf(stderr, "Failed to find the right connection.\n");
317 abort();
318 }
Holger Hans Peter Freyther38f7c752010-06-15 18:48:36 +0800319 if (memcmp(msg->data, bsc_cr_patched, sizeof(bsc_cr_patched)) != 0) {
320 fprintf(stderr, "Failed to patch the BSC CR msg.\n");
321 abort();
322 }
323 talloc_free(parsed);
324
325 /* 2.) get the cc */
326 copy_to_msg(msg, msc_cc, sizeof(msc_cc));
327 parsed = bsc_nat_parse(msg);
Holger Hans Peter Freyther49c7fb52010-06-15 18:48:55 +0800328 con_found = patch_sccp_src_ref_to_bsc(msg, parsed, nat);
329 VERIFY(con_found, con, msg, msc_cc_patched, "MSC CC");
330 if (update_sccp_src_ref(con_found, parsed) != 0) {
Holger Hans Peter Freyther38f7c752010-06-15 18:48:36 +0800331 fprintf(stderr, "Failed to update the SCCP con.\n");
332 abort();
333 }
Holger Hans Peter Freyther38f7c752010-06-15 18:48:36 +0800334
335 /* 3.) send some data */
336 copy_to_msg(msg, bsc_dtap, sizeof(bsc_dtap));
337 parsed = bsc_nat_parse(msg);
Holger Hans Peter Freytherb5513ca2010-04-21 18:56:12 +0800338 con_found = patch_sccp_src_ref_to_msc(msg, parsed, con);
Holger Hans Peter Freyther38f7c752010-06-15 18:48:36 +0800339 VERIFY(con_found, con, msg, bsc_dtap_patched, "BSC DTAP");
340
341 /* 4.) receive some data */
342 copy_to_msg(msg, msc_dtap, sizeof(msc_dtap));
343 parsed = bsc_nat_parse(msg);
344 con_found = patch_sccp_src_ref_to_bsc(msg, parsed, nat);
345 VERIFY(con_found, con, msg, msc_dtap_patched, "MSC DTAP");
346
347 /* 5.) close the connection */
348 copy_to_msg(msg, msc_rlsd, sizeof(msc_rlsd));
349 parsed = bsc_nat_parse(msg);
350 con_found = patch_sccp_src_ref_to_bsc(msg, parsed, nat);
351 VERIFY(con_found, con, msg, msc_rlsd_patched, "MSC RLSD");
352
353 /* 6.) confirm the connection close */
354 copy_to_msg(msg, bsc_rlc, sizeof(bsc_rlc));
355 parsed = bsc_nat_parse(msg);
Holger Hans Peter Freytherb5513ca2010-04-21 18:56:12 +0800356 con_found = patch_sccp_src_ref_to_msc(msg, parsed, con);
Holger Hans Peter Freyther49c7fb52010-06-15 18:48:55 +0800357 if (!con_found || con_found->bsc != con) {
Holger Hans Peter Freyther72ba1622010-06-15 18:48:44 +0800358 fprintf(stderr, "Failed to find the con: %p\n", con_found);
Holger Hans Peter Freyther38f7c752010-06-15 18:48:36 +0800359 abort();
360 }
361 if (memcmp(msg->data, bsc_rlc_patched, sizeof(bsc_rlc_patched)) != 0) {
362 fprintf(stderr, "Failed to patch the BSC CR msg.\n");
363 abort();
364 }
365 remove_sccp_src_ref(con, msg, parsed);
Holger Hans Peter Freyther9d518552010-04-05 21:44:51 +0200366 talloc_free(parsed);
367
368 copy_to_msg(msg, bsc_rlc, sizeof(bsc_rlc));
369 parsed = bsc_nat_parse(msg);
Holger Hans Peter Freytherb5513ca2010-04-21 18:56:12 +0800370 con_found = patch_sccp_src_ref_to_msc(msg, parsed, con);
Holger Hans Peter Freyther38f7c752010-06-15 18:48:36 +0800371
372 /* verify that it is gone */
373 if (con_found != NULL) {
Holger Hans Peter Freyther72ba1622010-06-15 18:48:44 +0800374 fprintf(stderr, "Con should be gone. %p\n", con_found);
Holger Hans Peter Freyther38f7c752010-06-15 18:48:36 +0800375 abort();
376 }
377 talloc_free(parsed);
378
379
Holger Hans Peter Freyther9212d9d2011-02-27 11:18:41 +0100380 bsc_config_free(con->cfg);
Holger Hans Peter Freyther38f7c752010-06-15 18:48:36 +0800381 talloc_free(nat);
382 msgb_free(msg);
383}
384
Holger Hans Peter Freyther04fd9922010-03-30 06:51:53 +0200385static void test_paging(void)
386{
Holger Hans Peter Freyther979a3092010-04-17 08:07:19 +0200387 int lac;
Holger Hans Peter Freyther04fd9922010-03-30 06:51:53 +0200388 struct bsc_nat *nat;
389 struct bsc_connection *con;
390 struct bsc_nat_parsed *parsed;
Holger Hans Peter Freyther0bd60f32010-10-08 22:08:29 +0800391 struct bsc_config *cfg;
Holger Hans Peter Freyther04fd9922010-03-30 06:51:53 +0200392 struct msgb *msg;
393
394 fprintf(stderr, "Testing paging by lac.\n");
395
396 nat = bsc_nat_alloc();
397 con = bsc_connection_alloc(nat);
Holger Hans Peter Freyther0bd60f32010-10-08 22:08:29 +0800398 cfg = bsc_config_alloc(nat, "unknown");
399 con->cfg = cfg;
400 bsc_config_add_lac(cfg, 23);
Holger Hans Peter Freyther04fd9922010-03-30 06:51:53 +0200401 con->authenticated = 1;
402 llist_add(&con->list_entry, &nat->bsc_connections);
403 msg = msgb_alloc(4096, "test");
404
405 /* Test completely bad input */
406 copy_to_msg(msg, paging_by_lac_cmd, sizeof(paging_by_lac_cmd));
Holger Hans Peter Freyther979a3092010-04-17 08:07:19 +0200407 if (bsc_nat_find_bsc(nat, msg, &lac) != 0) {
Holger Hans Peter Freyther04fd9922010-03-30 06:51:53 +0200408 fprintf(stderr, "Should have not found anything.\n");
409 abort();
410 }
411
412 /* Test it by not finding it */
413 copy_to_msg(msg, paging_by_lac_cmd, sizeof(paging_by_lac_cmd));
414 parsed = bsc_nat_parse(msg);
Holger Hans Peter Freyther979a3092010-04-17 08:07:19 +0200415 if (bsc_nat_find_bsc(nat, msg, &lac) != 0) {
Holger Hans Peter Freyther04fd9922010-03-30 06:51:53 +0200416 fprintf(stderr, "Should have not found aynthing.\n");
417 abort();
418 }
419 talloc_free(parsed);
420
421 /* Test by finding it */
Holger Hans Peter Freyther0bd60f32010-10-08 22:08:29 +0800422 bsc_config_del_lac(cfg, 23);
423 bsc_config_add_lac(cfg, 8213);
Holger Hans Peter Freyther04fd9922010-03-30 06:51:53 +0200424 copy_to_msg(msg, paging_by_lac_cmd, sizeof(paging_by_lac_cmd));
425 parsed = bsc_nat_parse(msg);
Holger Hans Peter Freyther979a3092010-04-17 08:07:19 +0200426 if (bsc_nat_find_bsc(nat, msg, &lac) != con) {
Holger Hans Peter Freyther04fd9922010-03-30 06:51:53 +0200427 fprintf(stderr, "Should have found it.\n");
428 abort();
429 }
430 talloc_free(parsed);
431}
432
Holger Hans Peter Freythera9e93312011-02-26 11:38:00 +0100433static void test_mgcp_allocations(void)
434{
435#if 0
436 struct bsc_connection *bsc;
437 struct bsc_nat *nat;
438 struct sccp_connections con;
Holger Hans Peter Freyther9ec030d2011-02-27 11:04:27 +0100439 int i, j, multiplex;
Holger Hans Peter Freythera9e93312011-02-26 11:38:00 +0100440
441 fprintf(stderr, "Testing MGCP.\n");
442 memset(&con, 0, sizeof(con));
443
444 nat = bsc_nat_alloc();
445 nat->bsc_endpoints = talloc_zero_array(nat,
446 struct bsc_endpoint,
447 65);
448 nat->mgcp_cfg = mgcp_config_alloc();
449 nat->mgcp_cfg->number_endpoints = 64;
450
451 bsc = bsc_connection_alloc(nat);
452 bsc->cfg = bsc_config_alloc(nat, "foo");
Holger Hans Peter Freyther9ec030d2011-02-27 11:04:27 +0100453 bsc->cfg->max_endpoints = 60;
Holger Hans Peter Freythera9e93312011-02-26 11:38:00 +0100454 bsc_config_add_lac(bsc->cfg, 2323);
455 bsc->last_endpoint = 0x22;
456 con.bsc = bsc;
457
458 bsc_init_endps_if_needed(bsc);
459
460 i = 1;
461 do {
462 if (bsc_assign_endpoint(bsc, &con) != 0) {
463 fprintf(stderr, "failed to allocate... on iteration %d\n", i);
464 break;
465 }
466 ++i;
467 } while(1);
468
Holger Hans Peter Freyther9ec030d2011-02-27 11:04:27 +0100469 multiplex = bsc_mgcp_nr_multiplexes(bsc->cfg->max_endpoints);
470 for (i = 0; i < multiplex; ++i) {
Holger Hans Peter Freythera9e93312011-02-26 11:38:00 +0100471 for (j = 0; j < 32; ++j)
472 printf("%d", bsc->_endpoint_status[i*32 + j]);
473 printf(": %d of %d\n", i*32 + 32, 32 * 8);
474 }
475#endif
476}
477
Holger Hans Peter Freytherfc9bd232010-04-01 03:55:27 +0200478static void test_mgcp_ass_tracking(void)
Holger Hans Peter Freyther465313e2010-06-15 18:49:53 +0800479{
Holger Hans Peter Freyther7b7eef62010-04-22 12:08:17 +0800480 struct bsc_connection *bsc;
481 struct bsc_nat *nat;
Holger Hans Peter Freyther465313e2010-06-15 18:49:53 +0800482 struct sccp_connections con;
483 struct bsc_nat_parsed *parsed;
484 struct msgb *msg;
485
486 fprintf(stderr, "Testing MGCP.\n");
487 memset(&con, 0, sizeof(con));
488
Holger Hans Peter Freyther7b7eef62010-04-22 12:08:17 +0800489 nat = bsc_nat_alloc();
490 nat->bsc_endpoints = talloc_zero_array(nat,
491 struct bsc_endpoint,
492 33);
Holger Hans Peter Freyther7e0cc502011-02-25 12:43:58 +0100493 nat->mgcp_cfg = mgcp_config_alloc();
494 nat->mgcp_cfg->number_endpoints = 64;
495
Holger Hans Peter Freyther7b7eef62010-04-22 12:08:17 +0800496 bsc = bsc_connection_alloc(nat);
Holger Hans Peter Freyther0bd60f32010-10-08 22:08:29 +0800497 bsc->cfg = bsc_config_alloc(nat, "foo");
498 bsc_config_add_lac(bsc->cfg, 2323);
Holger Hans Peter Freyther86c1db62011-02-25 17:10:25 +0100499 bsc->last_endpoint = 0x1e;
Holger Hans Peter Freyther7b7eef62010-04-22 12:08:17 +0800500 con.bsc = bsc;
501
Holger Hans Peter Freyther465313e2010-06-15 18:49:53 +0800502 msg = msgb_alloc(4096, "foo");
503 copy_to_msg(msg, ass_cmd, sizeof(ass_cmd));
504 parsed = bsc_nat_parse(msg);
Holger Hans Peter Freythercd702372010-09-20 01:21:51 +0800505
506 if (msg->l2h[16] != 0 ||
507 msg->l2h[17] != 0x1) {
508 fprintf(stderr, "Input is not as expected.. %s 0x%x\n",
509 hexdump(msg->l2h, msgb_l2len(msg)),
510 msg->l2h[17]);
511 abort();
512 }
513
Holger Hans Peter Freyther45fd07d2010-08-28 18:22:14 +0800514 if (bsc_mgcp_assign_patch(&con, msg) != 0) {
Holger Hans Peter Freyther465313e2010-06-15 18:49:53 +0800515 fprintf(stderr, "Failed to handle assignment.\n");
516 abort();
517 }
518
Holger Hans Peter Freythercd702372010-09-20 01:21:51 +0800519 if (con.msc_endp != 1) {
520 fprintf(stderr, "Timeslot should be 1.\n");
Holger Hans Peter Freyther465313e2010-06-15 18:49:53 +0800521 abort();
522 }
523
Holger Hans Peter Freyther86c1db62011-02-25 17:10:25 +0100524 if (con.bsc_endp != 0x1) {
Holger Hans Peter Freyther45fd07d2010-08-28 18:22:14 +0800525 fprintf(stderr, "Assigned timeslot should have been 1.\n");
Holger Hans Peter Freyther465313e2010-06-15 18:49:53 +0800526 abort();
527 }
Holger Hans Peter Freyther86c1db62011-02-25 17:10:25 +0100528 if (con.bsc->_endpoint_status[0x1] != 1) {
Holger Hans Peter Freyther45fd07d2010-08-28 18:22:14 +0800529 fprintf(stderr, "The status on the BSC is wrong.\n");
530 abort();
531 }
532
Holger Hans Peter Freythercd702372010-09-20 01:21:51 +0800533 int multiplex, timeslot;
Holger Hans Peter Freyther86c1db62011-02-25 17:10:25 +0100534 mgcp_endpoint_to_timeslot(0x1, &multiplex, &timeslot);
Holger Hans Peter Freythercd702372010-09-20 01:21:51 +0800535
536 uint16_t cic = htons(timeslot & 0x1f);
537 if (memcmp(&cic, &msg->l2h[16], sizeof(cic)) != 0) {
538 fprintf(stderr, "Message was not patched properly\n");
539 fprintf(stderr, "data cic: 0x%x %s\n", cic, hexdump(msg->l2h, msgb_l2len(msg)));
540 abort();
541 }
542
Holger Hans Peter Freyther465313e2010-06-15 18:49:53 +0800543 talloc_free(parsed);
544
Holger Hans Peter Freyther7b7eef62010-04-22 12:08:17 +0800545 bsc_mgcp_dlcx(&con);
Holger Hans Peter Freytherd2df4ca2010-09-19 20:54:21 +0800546 if (con.bsc_endp != -1 || con.msc_endp != -1 ||
Holger Hans Peter Freyther86c1db62011-02-25 17:10:25 +0100547 con.bsc->_endpoint_status[1] != 0 || con.bsc->last_endpoint != 0x1) {
Holger Hans Peter Freyther465313e2010-06-15 18:49:53 +0800548 fprintf(stderr, "Clearing should remove the mapping.\n");
549 abort();
550 }
Holger Hans Peter Freyther7b7eef62010-04-22 12:08:17 +0800551
Holger Hans Peter Freyther9212d9d2011-02-27 11:18:41 +0100552 bsc_config_free(bsc->cfg);
Holger Hans Peter Freyther7b7eef62010-04-22 12:08:17 +0800553 talloc_free(nat);
Holger Hans Peter Freyther465313e2010-06-15 18:49:53 +0800554}
555
Holger Hans Peter Freytherfc9bd232010-04-01 03:55:27 +0200556/* test the code to find a given connection */
557static void test_mgcp_find(void)
558{
559 struct bsc_nat *nat;
560 struct bsc_connection *con;
561 struct sccp_connections *sccp_con;
562
563 fprintf(stderr, "Testing finding of a BSC Connection\n");
564
565 nat = bsc_nat_alloc();
566 con = bsc_connection_alloc(nat);
567 llist_add(&con->list_entry, &nat->bsc_connections);
568
569 sccp_con = talloc_zero(con, struct sccp_connections);
Holger Hans Peter Freytherf4b34392010-08-28 16:08:39 +0800570 sccp_con->msc_endp = 12;
571 sccp_con->bsc_endp = 12;
Holger Hans Peter Freytherfc9bd232010-04-01 03:55:27 +0200572 sccp_con->bsc = con;
573 llist_add(&sccp_con->list_entry, &nat->sccp_connections);
574
575 if (bsc_mgcp_find_con(nat, 11) != NULL) {
576 fprintf(stderr, "Found the wrong connection.\n");
577 abort();
578 }
579
Holger Hans Peter Freyther08a1b162010-04-18 02:26:16 +0800580 if (bsc_mgcp_find_con(nat, 12) != sccp_con) {
Holger Hans Peter Freytherfc9bd232010-04-01 03:55:27 +0200581 fprintf(stderr, "Didn't find the connection\n");
582 abort();
583 }
584
Holger Hans Peter Freytherfc9bd232010-04-01 03:55:27 +0200585 /* free everything */
586 talloc_free(nat);
587}
588
Holger Hans Peter Freyther76c83542010-04-01 06:48:52 +0200589static void test_mgcp_rewrite(void)
590{
591 int i;
Holger Hans Peter Freyther8d200652010-04-04 18:09:10 +0200592 struct msgb *output;
Holger Hans Peter Freyther76c83542010-04-01 06:48:52 +0200593 fprintf(stderr, "Test rewriting MGCP messages.\n");
594
Holger Hans Peter Freyther76c83542010-04-01 06:48:52 +0200595 for (i = 0; i < ARRAY_SIZE(mgcp_messages); ++i) {
596 const char *orig = mgcp_messages[i].orig;
597 const char *patc = mgcp_messages[i].patch;
598 const char *ip = mgcp_messages[i].ip;
599 const int port = mgcp_messages[i].port;
600
Holger Hans Peter Freyther8d200652010-04-04 18:09:10 +0200601 char *input = strdup(orig);
Holger Hans Peter Freyther76c83542010-04-01 06:48:52 +0200602
Holger Hans Peter Freytherf7c86c52010-08-30 13:44:32 +0800603 output = bsc_mgcp_rewrite(input, strlen(input), 0x1e, ip, port);
Holger Hans Peter Freyther76c83542010-04-01 06:48:52 +0200604 if (msgb_l2len(output) != strlen(patc)) {
605 fprintf(stderr, "Wrong sizes for test: %d %d != %d != %d\n", i, msgb_l2len(output), strlen(patc), strlen(orig));
606 fprintf(stderr, "String '%s' vs '%s'\n", (const char *) output->l2h, patc);
607 abort();
608 }
609
610 if (memcmp(output->l2h, patc, msgb_l2len(output)) != 0) {
611 fprintf(stderr, "Broken on %d msg: '%s'\n", i, (const char *) output->l2h);
612 abort();
613 }
614
615 msgb_free(output);
Holger Hans Peter Freyther8d200652010-04-04 18:09:10 +0200616 free(input);
Holger Hans Peter Freyther76c83542010-04-01 06:48:52 +0200617 }
Holger Hans Peter Freyther76c83542010-04-01 06:48:52 +0200618}
619
Holger Hans Peter Freyther3c3bce12010-04-01 10:16:28 +0200620static void test_mgcp_parse(void)
621{
622 int code, ci;
623 char transaction[60];
624
625 fprintf(stderr, "Test MGCP response parsing.\n");
626
627 if (bsc_mgcp_parse_response(crcx_resp, &code, transaction) != 0) {
628 fprintf(stderr, "Failed to parse CRCX resp.\n");
629 abort();
630 }
631
632 if (code != 200) {
633 fprintf(stderr, "Failed to parse the CODE properly. Got: %d\n", code);
634 abort();
635 }
636
637 if (strcmp(transaction, "23265295") != 0) {
638 fprintf(stderr, "Failed to parse transaction id: '%s'\n", transaction);
639 abort();
640 }
641
642 ci = bsc_mgcp_extract_ci(crcx_resp);
643 if (ci != 1) {
644 fprintf(stderr, "Failed to parse the CI. Got: %d\n", ci);
645 abort();
646 }
647}
648
Holger Hans Peter Freyther34a96ae2010-05-14 19:49:35 +0800649struct cr_filter {
Holger Hans Peter Freytherdbd16fe2010-07-23 19:08:55 +0800650 const uint8_t *data;
Holger Hans Peter Freyther34a96ae2010-05-14 19:49:35 +0800651 int length;
652 int result;
Holger Hans Peter Freyther19c0a842010-05-16 02:00:40 +0800653 int contype;
Holger Hans Peter Freyther34a96ae2010-05-14 19:49:35 +0800654
655 const char *bsc_imsi_allow;
656 const char *bsc_imsi_deny;
Holger Hans Peter Freyther34a96ae2010-05-14 19:49:35 +0800657 const char *nat_imsi_deny;
658};
659
660static struct cr_filter cr_filter[] = {
661 {
662 .data = bssmap_cr,
663 .length = sizeof(bssmap_cr),
Holger Hans Peter Freytherd880f542010-09-15 01:42:07 +0800664 .result = 1,
Holger Hans Peter Freyther19c0a842010-05-16 02:00:40 +0800665 .contype = NAT_CON_TYPE_CM_SERV_REQ,
Holger Hans Peter Freyther34a96ae2010-05-14 19:49:35 +0800666 },
667 {
668 .data = bss_lu,
669 .length = sizeof(bss_lu),
Holger Hans Peter Freytherd880f542010-09-15 01:42:07 +0800670 .result = 1,
Holger Hans Peter Freyther19c0a842010-05-16 02:00:40 +0800671 .contype = NAT_CON_TYPE_LU,
Holger Hans Peter Freyther34a96ae2010-05-14 19:49:35 +0800672 },
673 {
Holger Hans Peter Freytherf1924982010-05-15 23:54:04 +0800674 .data = pag_resp,
675 .length = sizeof(pag_resp),
Holger Hans Peter Freytherd880f542010-09-15 01:42:07 +0800676 .result = 1,
Holger Hans Peter Freyther19c0a842010-05-16 02:00:40 +0800677 .contype = NAT_CON_TYPE_PAG_RESP,
Holger Hans Peter Freytherf1924982010-05-15 23:54:04 +0800678 },
679 {
Holger Hans Peter Freyther34a96ae2010-05-14 19:49:35 +0800680 /* nat deny is before blank/null BSC */
681 .data = bss_lu,
682 .length = sizeof(bss_lu),
683 .result = -3,
684 .nat_imsi_deny = "[0-9]*",
Holger Hans Peter Freyther19c0a842010-05-16 02:00:40 +0800685 .contype = NAT_CON_TYPE_LU,
Holger Hans Peter Freyther34a96ae2010-05-14 19:49:35 +0800686 },
687 {
Holger Hans Peter Freythera0aeaa72010-05-14 23:07:58 +0800688 /* BSC allow is before NAT deny */
Holger Hans Peter Freyther34a96ae2010-05-14 19:49:35 +0800689 .data = bss_lu,
690 .length = sizeof(bss_lu),
Holger Hans Peter Freytherd880f542010-09-15 01:42:07 +0800691 .result = 1,
Holger Hans Peter Freyther34a96ae2010-05-14 19:49:35 +0800692 .nat_imsi_deny = "[0-9]*",
Holger Hans Peter Freythera0aeaa72010-05-14 23:07:58 +0800693 .bsc_imsi_allow = "2440[0-9]*",
Holger Hans Peter Freyther19c0a842010-05-16 02:00:40 +0800694 .contype = NAT_CON_TYPE_LU,
Holger Hans Peter Freyther34a96ae2010-05-14 19:49:35 +0800695 },
696 {
697 /* BSC allow is before NAT deny */
698 .data = bss_lu,
699 .length = sizeof(bss_lu),
Holger Hans Peter Freytherd880f542010-09-15 01:42:07 +0800700 .result = 1,
Holger Hans Peter Freyther34a96ae2010-05-14 19:49:35 +0800701 .bsc_imsi_allow = "[0-9]*",
702 .nat_imsi_deny = "[0-9]*",
Holger Hans Peter Freyther19c0a842010-05-16 02:00:40 +0800703 .contype = NAT_CON_TYPE_LU,
Holger Hans Peter Freyther34a96ae2010-05-14 19:49:35 +0800704 },
705 {
706 /* filter as deny is first */
707 .data = bss_lu,
708 .length = sizeof(bss_lu),
Holger Hans Peter Freyther1fd60632010-10-19 20:55:33 +0200709 .result = 1,
Holger Hans Peter Freyther34a96ae2010-05-14 19:49:35 +0800710 .bsc_imsi_deny = "[0-9]*",
711 .bsc_imsi_allow = "[0-9]*",
712 .nat_imsi_deny = "[0-9]*",
Holger Hans Peter Freyther19c0a842010-05-16 02:00:40 +0800713 .contype = NAT_CON_TYPE_LU,
Holger Hans Peter Freyther34a96ae2010-05-14 19:49:35 +0800714 },
Holger Hans Peter Freyther1fd60632010-10-19 20:55:33 +0200715 {
716 /* deny by nat rule */
717 .data = bss_lu,
718 .length = sizeof(bss_lu),
719 .result = -3,
720 .bsc_imsi_deny = "000[0-9]*",
721 .nat_imsi_deny = "[0-9]*",
722 .contype = NAT_CON_TYPE_LU,
723 },
724 {
725 /* deny by bsc rule */
726 .data = bss_lu,
727 .length = sizeof(bss_lu),
728 .result = -2,
729 .bsc_imsi_deny = "[0-9]*",
730 .contype = NAT_CON_TYPE_LU,
731 },
Holger Hans Peter Freyther34a96ae2010-05-14 19:49:35 +0800732
733};
734
Holger Hans Peter Freyther0c08db12010-05-14 08:12:57 +0800735static void test_cr_filter()
736{
Holger Hans Peter Freyther19c0a842010-05-16 02:00:40 +0800737 int i, res, contype;
Holger Hans Peter Freyther0c08db12010-05-14 08:12:57 +0800738 struct msgb *msg = msgb_alloc(4096, "test_cr_filter");
Holger Hans Peter Freyther0c08db12010-05-14 08:12:57 +0800739 struct bsc_nat_parsed *parsed;
Holger Hans Peter Freyther29c67032010-06-08 10:14:44 +0800740 struct bsc_nat_acc_lst *nat_lst, *bsc_lst;
Holger Hans Peter Freytherd77c8172010-06-08 10:53:39 +0800741 struct bsc_nat_acc_lst_entry *nat_entry, *bsc_entry;
Holger Hans Peter Freyther0c08db12010-05-14 08:12:57 +0800742
Holger Hans Peter Freyther34a96ae2010-05-14 19:49:35 +0800743 struct bsc_nat *nat = bsc_nat_alloc();
744 struct bsc_connection *bsc = bsc_connection_alloc(nat);
Holger Hans Peter Freyther0bd60f32010-10-08 22:08:29 +0800745 bsc->cfg = bsc_config_alloc(nat, "foo");
746 bsc_config_add_lac(bsc->cfg, 1234);
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +0800747 bsc->cfg->acc_lst_name = "bsc";
748 nat->acc_lst_name = "nat";
Holger Hans Peter Freyther34a96ae2010-05-14 19:49:35 +0800749
Holger Hans Peter Freytherd77c8172010-06-08 10:53:39 +0800750 nat_lst = bsc_nat_acc_lst_get(nat, "nat");
751 bsc_lst = bsc_nat_acc_lst_get(nat, "bsc");
752
753 bsc_entry = bsc_nat_acc_lst_entry_create(bsc_lst);
754 nat_entry = bsc_nat_acc_lst_entry_create(nat_lst);
755
Holger Hans Peter Freyther34a96ae2010-05-14 19:49:35 +0800756 for (i = 0; i < ARRAY_SIZE(cr_filter); ++i) {
Holger Hans Peter Freyther749497e2010-09-29 01:19:42 +0800757 char *imsi;
Holger Hans Peter Freyther34a96ae2010-05-14 19:49:35 +0800758 msgb_reset(msg);
759 copy_to_msg(msg, cr_filter[i].data, cr_filter[i].length);
760
Holger Hans Peter Freyther29c67032010-06-08 10:14:44 +0800761 nat_lst = bsc_nat_acc_lst_get(nat, "nat");
762 bsc_lst = bsc_nat_acc_lst_get(nat, "bsc");
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +0800763
Holger Hans Peter Freytherd77c8172010-06-08 10:53:39 +0800764 bsc_parse_reg(nat_entry, &nat_entry->imsi_deny_re, &nat_entry->imsi_deny,
Holger Hans Peter Freyther34a96ae2010-05-14 19:49:35 +0800765 cr_filter[i].nat_imsi_deny ? 1 : 0,
766 &cr_filter[i].nat_imsi_deny);
Holger Hans Peter Freytherd77c8172010-06-08 10:53:39 +0800767 bsc_parse_reg(bsc_entry, &bsc_entry->imsi_allow_re, &bsc_entry->imsi_allow,
Holger Hans Peter Freyther34a96ae2010-05-14 19:49:35 +0800768 cr_filter[i].bsc_imsi_allow ? 1 : 0,
769 &cr_filter[i].bsc_imsi_allow);
Holger Hans Peter Freytherd77c8172010-06-08 10:53:39 +0800770 bsc_parse_reg(bsc_entry, &bsc_entry->imsi_deny_re, &bsc_entry->imsi_deny,
Holger Hans Peter Freyther34a96ae2010-05-14 19:49:35 +0800771 cr_filter[i].bsc_imsi_deny ? 1 : 0,
772 &cr_filter[i].bsc_imsi_deny);
773
774 parsed = bsc_nat_parse(msg);
775 if (!parsed) {
776 fprintf(stderr, "FAIL: Failed to parse the message\n");
777 abort();
778 }
779
Holger Hans Peter Freyther749497e2010-09-29 01:19:42 +0800780 res = bsc_nat_filter_sccp_cr(bsc, msg, parsed, &contype, &imsi);
Holger Hans Peter Freyther34a96ae2010-05-14 19:49:35 +0800781 if (res != cr_filter[i].result) {
782 fprintf(stderr, "FAIL: Wrong result %d for test %d.\n", res, i);
783 abort();
784 }
785
Holger Hans Peter Freyther19c0a842010-05-16 02:00:40 +0800786 if (contype != cr_filter[i].contype) {
787 fprintf(stderr, "FAIL: Wrong contype %d for test %d.\n", res, contype);
788 abort();
789 }
790
Holger Hans Peter Freyther749497e2010-09-29 01:19:42 +0800791 talloc_steal(parsed, imsi);
Holger Hans Peter Freyther34a96ae2010-05-14 19:49:35 +0800792 talloc_free(parsed);
Holger Hans Peter Freyther0c08db12010-05-14 08:12:57 +0800793 }
794
Holger Hans Peter Freyther0c08db12010-05-14 08:12:57 +0800795 msgb_free(msg);
796}
797
Holger Hans Peter Freyther32685402010-09-15 05:20:40 +0800798static void test_dt_filter()
799{
800 int i;
801 struct msgb *msg = msgb_alloc(4096, "test_dt_filter");
802 struct bsc_nat_parsed *parsed;
803
804 struct bsc_nat *nat = bsc_nat_alloc();
805 struct bsc_connection *bsc = bsc_connection_alloc(nat);
806 struct sccp_connections *con = talloc_zero(0, struct sccp_connections);
807
Holger Hans Peter Freyther0bd60f32010-10-08 22:08:29 +0800808 bsc->cfg = bsc_config_alloc(nat, "foo");
809 bsc_config_add_lac(bsc->cfg, 23);
Holger Hans Peter Freyther32685402010-09-15 05:20:40 +0800810 con->bsc = bsc;
811
812 msgb_reset(msg);
813 copy_to_msg(msg, id_resp, ARRAY_SIZE(id_resp));
814
815 parsed = bsc_nat_parse(msg);
816 if (!parsed) {
817 fprintf(stderr, "FAIL: Could not parse ID resp\n");
818 abort();
819 }
820
821 if (parsed->bssap != BSSAP_MSG_DTAP) {
822 fprintf(stderr, "FAIL: It should be dtap\n");
823 abort();
824 }
825
826 /* gsm_type is actually the size of the dtap */
827 if (parsed->gsm_type < msgb_l3len(msg) - 3) {
828 fprintf(stderr, "FAIL: Not enough space for the content\n");
829 abort();
830 }
831
832 if (bsc_nat_filter_dt(bsc, msg, con, parsed) != 1) {
833 fprintf(stderr, "FAIL: Should have passed..\n");
834 abort();
835 }
836
837 /* just some basic length checking... */
838 for (i = ARRAY_SIZE(id_resp); i >= 0; --i) {
839 msgb_reset(msg);
840 copy_to_msg(msg, id_resp, ARRAY_SIZE(id_resp));
841
842 parsed = bsc_nat_parse(msg);
843 if (!parsed)
844 continue;
845
846 con->imsi_checked = 0;
847 bsc_nat_filter_dt(bsc, msg, con, parsed);
848 }
849}
850
Holger Hans Peter Freyther73bbf892010-10-21 14:46:57 +0200851static void test_setup_rewrite()
852{
853 struct msgb *msg = msgb_alloc(4096, "test_dt_filter");
854 struct msgb *out;
855 struct bsc_nat_parsed *parsed;
856 const char *imsi = "27408000001234";
857
858 struct bsc_nat *nat = bsc_nat_alloc();
859
860 /* a fake list */
861 struct msg_entries entries;
862 struct msg_entry entry;
863
864 INIT_LLIST_HEAD(&entries.entry);
865 entry.mcc = "274";
866 entry.mnc = "08";
867 entry.option = "^0([1-9])";
868 entry.text = "0049";
869 llist_add_tail(&entry.list, &entries.entry);
870 nat->num_rewr = &entries;
871
872 /* verify that nothing changed */
873 msgb_reset(msg);
874 copy_to_msg(msg, cc_setup_international, ARRAY_SIZE(cc_setup_international));
875 parsed = bsc_nat_parse(msg);
876 if (!parsed) {
877 fprintf(stderr, "FAIL: Could not parse ID resp\n");
878 abort();
879 }
880
881 out = bsc_nat_rewrite_setup(nat, msg, parsed, imsi);
882 if (msg != out) {
883 fprintf(stderr, "FAIL: The message should not have been changed\n");
884 abort();
885 }
886
887 if (out->len != ARRAY_SIZE(cc_setup_international)) {
888 fprintf(stderr, "FAIL: Length of message changed\n");
889 abort();
890 }
891
892 if (memcmp(out->data, cc_setup_international, out->len) != 0) {
893 fprintf(stderr, "FAIL: Content modified..\n");
894 abort();
895 }
896 talloc_free(parsed);
897
898 /* verify that something in the message changes */
899 msgb_reset(msg);
900 copy_to_msg(msg, cc_setup_national, ARRAY_SIZE(cc_setup_national));
901 parsed = bsc_nat_parse(msg);
902 if (!parsed) {
903 fprintf(stderr, "FAIL: Could not parse ID resp\n");
904 abort();
905 }
906
907 out = bsc_nat_rewrite_setup(nat, msg, parsed, imsi);
908 if (!out) {
909 fprintf(stderr, "FAIL: A new message should be created.\n");
910 abort();
911 }
912
913 if (msg == out) {
914 fprintf(stderr, "FAIL: The message should have changed\n");
915 abort();
916 }
917
918 if (out->len != ARRAY_SIZE(cc_setup_national_patched)) {
919 fprintf(stderr, "FAIL: Length is wrong.\n");
920 abort();
921 }
922
923 if (memcmp(cc_setup_national_patched, out->data, out->len) != 0) {
924 fprintf(stderr, "FAIL: Data is wrong.\n");
925 fprintf(stderr, "Data was: %s\n", hexdump(out->data, out->len));
926 abort();
927 }
928
929 msgb_free(out);
Holger Hans Peter Freyther74779c62010-10-28 15:27:00 +0200930
931 /* Make sure that a wildcard is matching */
932 entry.mnc = "*";
933 msg = msgb_alloc(4096, "test_dt_filter");
934 copy_to_msg(msg, cc_setup_national, ARRAY_SIZE(cc_setup_national));
935 parsed = bsc_nat_parse(msg);
936 if (!parsed) {
937 fprintf(stderr, "FAIL: Could not parse ID resp\n");
938 abort();
939 }
940
941 out = bsc_nat_rewrite_setup(nat, msg, parsed, imsi);
942 if (!out) {
943 fprintf(stderr, "FAIL: A new message should be created.\n");
944 abort();
945 }
946
947 if (msg == out) {
948 fprintf(stderr, "FAIL: The message should have changed\n");
949 abort();
950 }
951
952 if (out->len != ARRAY_SIZE(cc_setup_national_patched)) {
953 fprintf(stderr, "FAIL: Length is wrong.\n");
954 abort();
955 }
956
957 if (memcmp(cc_setup_national_patched, out->data, out->len) != 0) {
958 fprintf(stderr, "FAIL: Data is wrong.\n");
959 fprintf(stderr, "Data was: %s\n", hexdump(out->data, out->len));
960 abort();
961 }
962
963 msgb_free(out);
964
965 /* Make sure that a wildcard is matching */
966 entry.mnc = "09";
967 msg = msgb_alloc(4096, "test_dt_filter");
968 copy_to_msg(msg, cc_setup_national, ARRAY_SIZE(cc_setup_national));
969 parsed = bsc_nat_parse(msg);
970 if (!parsed) {
971 fprintf(stderr, "FAIL: Could not parse ID resp\n");
972 abort();
973 }
974
975 out = bsc_nat_rewrite_setup(nat, msg, parsed, imsi);
976 if (out != msg) {
977 fprintf(stderr, "FAIL: The message should be unchanged.\n");
978 abort();
979 }
980
981 if (out->len != ARRAY_SIZE(cc_setup_national)) {
982 fprintf(stderr, "FAIL: Foo\n");
983 abort();
984 }
985
986 if (memcmp(out->data, cc_setup_national, ARRAY_SIZE(cc_setup_national)) != 0) {
987 fprintf(stderr, "FAIL: The message should really be unchanged.\n");
988 abort();
989 }
990
991 msgb_free(out);
Holger Hans Peter Freyther73bbf892010-10-21 14:46:57 +0200992}
993
Holger Hans Peter Freyther38f7c752010-06-15 18:48:36 +0800994int main(int argc, char **argv)
995{
Holger Hans Peter Freyther434a1fd2010-06-15 20:18:40 +0800996 struct log_target *stderr_target;
Holger Hans Peter Freyther38f7c752010-06-15 18:48:36 +0800997
Holger Hans Peter Freyther30e1ae92010-07-30 02:53:14 +0800998 sccp_set_log_area(DSCCP);
Holger Hans Peter Freytherf0945402010-07-05 13:29:42 +0800999 log_init(&log_info);
Holger Hans Peter Freyther434a1fd2010-06-15 20:18:40 +08001000 stderr_target = log_target_create_stderr();
1001 log_add_target(stderr_target);
1002 log_set_all_filter(stderr_target, 1);
Holger Hans Peter Freyther38f7c752010-06-15 18:48:36 +08001003
1004 test_filter();
Holger Hans Peter Freyther04fd9922010-03-30 06:51:53 +02001005 test_contrack();
Holger Hans Peter Freyther04fd9922010-03-30 06:51:53 +02001006 test_paging();
Holger Hans Peter Freytherfc9bd232010-04-01 03:55:27 +02001007 test_mgcp_ass_tracking();
1008 test_mgcp_find();
Holger Hans Peter Freyther76c83542010-04-01 06:48:52 +02001009 test_mgcp_rewrite();
Holger Hans Peter Freyther3c3bce12010-04-01 10:16:28 +02001010 test_mgcp_parse();
Holger Hans Peter Freyther0c08db12010-05-14 08:12:57 +08001011 test_cr_filter();
Holger Hans Peter Freyther32685402010-09-15 05:20:40 +08001012 test_dt_filter();
Holger Hans Peter Freyther73bbf892010-10-21 14:46:57 +02001013 test_setup_rewrite();
Holger Hans Peter Freythera9e93312011-02-26 11:38:00 +01001014 test_mgcp_allocations();
Holger Hans Peter Freyther0b8f69d2010-06-15 18:45:38 +08001015 return 0;
1016}