blob: 1d9052d6fa29568e8c0c0d50a9775c34b3d343da [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
380 talloc_free(nat);
381 msgb_free(msg);
382}
383
Holger Hans Peter Freyther04fd9922010-03-30 06:51:53 +0200384static void test_paging(void)
385{
Holger Hans Peter Freyther979a3092010-04-17 08:07:19 +0200386 int lac;
Holger Hans Peter Freyther04fd9922010-03-30 06:51:53 +0200387 struct bsc_nat *nat;
388 struct bsc_connection *con;
389 struct bsc_nat_parsed *parsed;
Holger Hans Peter Freyther0bd60f32010-10-08 22:08:29 +0800390 struct bsc_config *cfg;
Holger Hans Peter Freyther04fd9922010-03-30 06:51:53 +0200391 struct msgb *msg;
392
393 fprintf(stderr, "Testing paging by lac.\n");
394
395 nat = bsc_nat_alloc();
396 con = bsc_connection_alloc(nat);
Holger Hans Peter Freyther0bd60f32010-10-08 22:08:29 +0800397 cfg = bsc_config_alloc(nat, "unknown");
398 con->cfg = cfg;
399 bsc_config_add_lac(cfg, 23);
Holger Hans Peter Freyther04fd9922010-03-30 06:51:53 +0200400 con->authenticated = 1;
401 llist_add(&con->list_entry, &nat->bsc_connections);
402 msg = msgb_alloc(4096, "test");
403
404 /* Test completely bad input */
405 copy_to_msg(msg, paging_by_lac_cmd, sizeof(paging_by_lac_cmd));
Holger Hans Peter Freyther979a3092010-04-17 08:07:19 +0200406 if (bsc_nat_find_bsc(nat, msg, &lac) != 0) {
Holger Hans Peter Freyther04fd9922010-03-30 06:51:53 +0200407 fprintf(stderr, "Should have not found anything.\n");
408 abort();
409 }
410
411 /* Test it by not finding it */
412 copy_to_msg(msg, paging_by_lac_cmd, sizeof(paging_by_lac_cmd));
413 parsed = bsc_nat_parse(msg);
Holger Hans Peter Freyther979a3092010-04-17 08:07:19 +0200414 if (bsc_nat_find_bsc(nat, msg, &lac) != 0) {
Holger Hans Peter Freyther04fd9922010-03-30 06:51:53 +0200415 fprintf(stderr, "Should have not found aynthing.\n");
416 abort();
417 }
418 talloc_free(parsed);
419
420 /* Test by finding it */
Holger Hans Peter Freyther0bd60f32010-10-08 22:08:29 +0800421 bsc_config_del_lac(cfg, 23);
422 bsc_config_add_lac(cfg, 8213);
Holger Hans Peter Freyther04fd9922010-03-30 06:51:53 +0200423 copy_to_msg(msg, paging_by_lac_cmd, sizeof(paging_by_lac_cmd));
424 parsed = bsc_nat_parse(msg);
Holger Hans Peter Freyther979a3092010-04-17 08:07:19 +0200425 if (bsc_nat_find_bsc(nat, msg, &lac) != con) {
Holger Hans Peter Freyther04fd9922010-03-30 06:51:53 +0200426 fprintf(stderr, "Should have found it.\n");
427 abort();
428 }
429 talloc_free(parsed);
430}
431
Holger Hans Peter Freythera9e93312011-02-26 11:38:00 +0100432static void test_mgcp_allocations(void)
433{
434#if 0
435 struct bsc_connection *bsc;
436 struct bsc_nat *nat;
437 struct sccp_connections con;
Holger Hans Peter Freyther9ec030d2011-02-27 11:04:27 +0100438 int i, j, multiplex;
Holger Hans Peter Freythera9e93312011-02-26 11:38:00 +0100439
440 fprintf(stderr, "Testing MGCP.\n");
441 memset(&con, 0, sizeof(con));
442
443 nat = bsc_nat_alloc();
444 nat->bsc_endpoints = talloc_zero_array(nat,
445 struct bsc_endpoint,
446 65);
447 nat->mgcp_cfg = mgcp_config_alloc();
448 nat->mgcp_cfg->number_endpoints = 64;
449
450 bsc = bsc_connection_alloc(nat);
451 bsc->cfg = bsc_config_alloc(nat, "foo");
Holger Hans Peter Freyther9ec030d2011-02-27 11:04:27 +0100452 bsc->cfg->max_endpoints = 60;
Holger Hans Peter Freythera9e93312011-02-26 11:38:00 +0100453 bsc_config_add_lac(bsc->cfg, 2323);
454 bsc->last_endpoint = 0x22;
455 con.bsc = bsc;
456
457 bsc_init_endps_if_needed(bsc);
458
459 i = 1;
460 do {
461 if (bsc_assign_endpoint(bsc, &con) != 0) {
462 fprintf(stderr, "failed to allocate... on iteration %d\n", i);
463 break;
464 }
465 ++i;
466 } while(1);
467
Holger Hans Peter Freyther9ec030d2011-02-27 11:04:27 +0100468 multiplex = bsc_mgcp_nr_multiplexes(bsc->cfg->max_endpoints);
469 for (i = 0; i < multiplex; ++i) {
Holger Hans Peter Freythera9e93312011-02-26 11:38:00 +0100470 for (j = 0; j < 32; ++j)
471 printf("%d", bsc->_endpoint_status[i*32 + j]);
472 printf(": %d of %d\n", i*32 + 32, 32 * 8);
473 }
474#endif
475}
476
Holger Hans Peter Freytherfc9bd232010-04-01 03:55:27 +0200477static void test_mgcp_ass_tracking(void)
Holger Hans Peter Freyther465313e2010-06-15 18:49:53 +0800478{
Holger Hans Peter Freyther7b7eef62010-04-22 12:08:17 +0800479 struct bsc_connection *bsc;
480 struct bsc_nat *nat;
Holger Hans Peter Freyther465313e2010-06-15 18:49:53 +0800481 struct sccp_connections con;
482 struct bsc_nat_parsed *parsed;
483 struct msgb *msg;
484
485 fprintf(stderr, "Testing MGCP.\n");
486 memset(&con, 0, sizeof(con));
487
Holger Hans Peter Freyther7b7eef62010-04-22 12:08:17 +0800488 nat = bsc_nat_alloc();
489 nat->bsc_endpoints = talloc_zero_array(nat,
490 struct bsc_endpoint,
491 33);
Holger Hans Peter Freyther7e0cc502011-02-25 12:43:58 +0100492 nat->mgcp_cfg = mgcp_config_alloc();
493 nat->mgcp_cfg->number_endpoints = 64;
494
Holger Hans Peter Freyther7b7eef62010-04-22 12:08:17 +0800495 bsc = bsc_connection_alloc(nat);
Holger Hans Peter Freyther0bd60f32010-10-08 22:08:29 +0800496 bsc->cfg = bsc_config_alloc(nat, "foo");
497 bsc_config_add_lac(bsc->cfg, 2323);
Holger Hans Peter Freyther86c1db62011-02-25 17:10:25 +0100498 bsc->last_endpoint = 0x1e;
Holger Hans Peter Freyther7b7eef62010-04-22 12:08:17 +0800499 con.bsc = bsc;
500
Holger Hans Peter Freyther465313e2010-06-15 18:49:53 +0800501 msg = msgb_alloc(4096, "foo");
502 copy_to_msg(msg, ass_cmd, sizeof(ass_cmd));
503 parsed = bsc_nat_parse(msg);
Holger Hans Peter Freythercd702372010-09-20 01:21:51 +0800504
505 if (msg->l2h[16] != 0 ||
506 msg->l2h[17] != 0x1) {
507 fprintf(stderr, "Input is not as expected.. %s 0x%x\n",
508 hexdump(msg->l2h, msgb_l2len(msg)),
509 msg->l2h[17]);
510 abort();
511 }
512
Holger Hans Peter Freyther45fd07d2010-08-28 18:22:14 +0800513 if (bsc_mgcp_assign_patch(&con, msg) != 0) {
Holger Hans Peter Freyther465313e2010-06-15 18:49:53 +0800514 fprintf(stderr, "Failed to handle assignment.\n");
515 abort();
516 }
517
Holger Hans Peter Freythercd702372010-09-20 01:21:51 +0800518 if (con.msc_endp != 1) {
519 fprintf(stderr, "Timeslot should be 1.\n");
Holger Hans Peter Freyther465313e2010-06-15 18:49:53 +0800520 abort();
521 }
522
Holger Hans Peter Freyther86c1db62011-02-25 17:10:25 +0100523 if (con.bsc_endp != 0x1) {
Holger Hans Peter Freyther45fd07d2010-08-28 18:22:14 +0800524 fprintf(stderr, "Assigned timeslot should have been 1.\n");
Holger Hans Peter Freyther465313e2010-06-15 18:49:53 +0800525 abort();
526 }
Holger Hans Peter Freyther86c1db62011-02-25 17:10:25 +0100527 if (con.bsc->_endpoint_status[0x1] != 1) {
Holger Hans Peter Freyther45fd07d2010-08-28 18:22:14 +0800528 fprintf(stderr, "The status on the BSC is wrong.\n");
529 abort();
530 }
531
Holger Hans Peter Freythercd702372010-09-20 01:21:51 +0800532 int multiplex, timeslot;
Holger Hans Peter Freyther86c1db62011-02-25 17:10:25 +0100533 mgcp_endpoint_to_timeslot(0x1, &multiplex, &timeslot);
Holger Hans Peter Freythercd702372010-09-20 01:21:51 +0800534
535 uint16_t cic = htons(timeslot & 0x1f);
536 if (memcmp(&cic, &msg->l2h[16], sizeof(cic)) != 0) {
537 fprintf(stderr, "Message was not patched properly\n");
538 fprintf(stderr, "data cic: 0x%x %s\n", cic, hexdump(msg->l2h, msgb_l2len(msg)));
539 abort();
540 }
541
Holger Hans Peter Freyther465313e2010-06-15 18:49:53 +0800542 talloc_free(parsed);
543
Holger Hans Peter Freyther7b7eef62010-04-22 12:08:17 +0800544 bsc_mgcp_dlcx(&con);
Holger Hans Peter Freytherd2df4ca2010-09-19 20:54:21 +0800545 if (con.bsc_endp != -1 || con.msc_endp != -1 ||
Holger Hans Peter Freyther86c1db62011-02-25 17:10:25 +0100546 con.bsc->_endpoint_status[1] != 0 || con.bsc->last_endpoint != 0x1) {
Holger Hans Peter Freyther465313e2010-06-15 18:49:53 +0800547 fprintf(stderr, "Clearing should remove the mapping.\n");
548 abort();
549 }
Holger Hans Peter Freyther7b7eef62010-04-22 12:08:17 +0800550
551 talloc_free(nat);
Holger Hans Peter Freyther465313e2010-06-15 18:49:53 +0800552}
553
Holger Hans Peter Freytherfc9bd232010-04-01 03:55:27 +0200554/* test the code to find a given connection */
555static void test_mgcp_find(void)
556{
557 struct bsc_nat *nat;
558 struct bsc_connection *con;
559 struct sccp_connections *sccp_con;
560
561 fprintf(stderr, "Testing finding of a BSC Connection\n");
562
563 nat = bsc_nat_alloc();
564 con = bsc_connection_alloc(nat);
565 llist_add(&con->list_entry, &nat->bsc_connections);
566
567 sccp_con = talloc_zero(con, struct sccp_connections);
Holger Hans Peter Freytherf4b34392010-08-28 16:08:39 +0800568 sccp_con->msc_endp = 12;
569 sccp_con->bsc_endp = 12;
Holger Hans Peter Freytherfc9bd232010-04-01 03:55:27 +0200570 sccp_con->bsc = con;
571 llist_add(&sccp_con->list_entry, &nat->sccp_connections);
572
573 if (bsc_mgcp_find_con(nat, 11) != NULL) {
574 fprintf(stderr, "Found the wrong connection.\n");
575 abort();
576 }
577
Holger Hans Peter Freyther08a1b162010-04-18 02:26:16 +0800578 if (bsc_mgcp_find_con(nat, 12) != sccp_con) {
Holger Hans Peter Freytherfc9bd232010-04-01 03:55:27 +0200579 fprintf(stderr, "Didn't find the connection\n");
580 abort();
581 }
582
Holger Hans Peter Freytherfc9bd232010-04-01 03:55:27 +0200583 /* free everything */
584 talloc_free(nat);
585}
586
Holger Hans Peter Freyther76c83542010-04-01 06:48:52 +0200587static void test_mgcp_rewrite(void)
588{
589 int i;
Holger Hans Peter Freyther8d200652010-04-04 18:09:10 +0200590 struct msgb *output;
Holger Hans Peter Freyther76c83542010-04-01 06:48:52 +0200591 fprintf(stderr, "Test rewriting MGCP messages.\n");
592
Holger Hans Peter Freyther76c83542010-04-01 06:48:52 +0200593 for (i = 0; i < ARRAY_SIZE(mgcp_messages); ++i) {
594 const char *orig = mgcp_messages[i].orig;
595 const char *patc = mgcp_messages[i].patch;
596 const char *ip = mgcp_messages[i].ip;
597 const int port = mgcp_messages[i].port;
598
Holger Hans Peter Freyther8d200652010-04-04 18:09:10 +0200599 char *input = strdup(orig);
Holger Hans Peter Freyther76c83542010-04-01 06:48:52 +0200600
Holger Hans Peter Freytherf7c86c52010-08-30 13:44:32 +0800601 output = bsc_mgcp_rewrite(input, strlen(input), 0x1e, ip, port);
Holger Hans Peter Freyther76c83542010-04-01 06:48:52 +0200602 if (msgb_l2len(output) != strlen(patc)) {
603 fprintf(stderr, "Wrong sizes for test: %d %d != %d != %d\n", i, msgb_l2len(output), strlen(patc), strlen(orig));
604 fprintf(stderr, "String '%s' vs '%s'\n", (const char *) output->l2h, patc);
605 abort();
606 }
607
608 if (memcmp(output->l2h, patc, msgb_l2len(output)) != 0) {
609 fprintf(stderr, "Broken on %d msg: '%s'\n", i, (const char *) output->l2h);
610 abort();
611 }
612
613 msgb_free(output);
Holger Hans Peter Freyther8d200652010-04-04 18:09:10 +0200614 free(input);
Holger Hans Peter Freyther76c83542010-04-01 06:48:52 +0200615 }
Holger Hans Peter Freyther76c83542010-04-01 06:48:52 +0200616}
617
Holger Hans Peter Freyther3c3bce12010-04-01 10:16:28 +0200618static void test_mgcp_parse(void)
619{
620 int code, ci;
621 char transaction[60];
622
623 fprintf(stderr, "Test MGCP response parsing.\n");
624
625 if (bsc_mgcp_parse_response(crcx_resp, &code, transaction) != 0) {
626 fprintf(stderr, "Failed to parse CRCX resp.\n");
627 abort();
628 }
629
630 if (code != 200) {
631 fprintf(stderr, "Failed to parse the CODE properly. Got: %d\n", code);
632 abort();
633 }
634
635 if (strcmp(transaction, "23265295") != 0) {
636 fprintf(stderr, "Failed to parse transaction id: '%s'\n", transaction);
637 abort();
638 }
639
640 ci = bsc_mgcp_extract_ci(crcx_resp);
641 if (ci != 1) {
642 fprintf(stderr, "Failed to parse the CI. Got: %d\n", ci);
643 abort();
644 }
645}
646
Holger Hans Peter Freyther34a96ae2010-05-14 19:49:35 +0800647struct cr_filter {
Holger Hans Peter Freytherdbd16fe2010-07-23 19:08:55 +0800648 const uint8_t *data;
Holger Hans Peter Freyther34a96ae2010-05-14 19:49:35 +0800649 int length;
650 int result;
Holger Hans Peter Freyther19c0a842010-05-16 02:00:40 +0800651 int contype;
Holger Hans Peter Freyther34a96ae2010-05-14 19:49:35 +0800652
653 const char *bsc_imsi_allow;
654 const char *bsc_imsi_deny;
Holger Hans Peter Freyther34a96ae2010-05-14 19:49:35 +0800655 const char *nat_imsi_deny;
656};
657
658static struct cr_filter cr_filter[] = {
659 {
660 .data = bssmap_cr,
661 .length = sizeof(bssmap_cr),
Holger Hans Peter Freytherd880f542010-09-15 01:42:07 +0800662 .result = 1,
Holger Hans Peter Freyther19c0a842010-05-16 02:00:40 +0800663 .contype = NAT_CON_TYPE_CM_SERV_REQ,
Holger Hans Peter Freyther34a96ae2010-05-14 19:49:35 +0800664 },
665 {
666 .data = bss_lu,
667 .length = sizeof(bss_lu),
Holger Hans Peter Freytherd880f542010-09-15 01:42:07 +0800668 .result = 1,
Holger Hans Peter Freyther19c0a842010-05-16 02:00:40 +0800669 .contype = NAT_CON_TYPE_LU,
Holger Hans Peter Freyther34a96ae2010-05-14 19:49:35 +0800670 },
671 {
Holger Hans Peter Freytherf1924982010-05-15 23:54:04 +0800672 .data = pag_resp,
673 .length = sizeof(pag_resp),
Holger Hans Peter Freytherd880f542010-09-15 01:42:07 +0800674 .result = 1,
Holger Hans Peter Freyther19c0a842010-05-16 02:00:40 +0800675 .contype = NAT_CON_TYPE_PAG_RESP,
Holger Hans Peter Freytherf1924982010-05-15 23:54:04 +0800676 },
677 {
Holger Hans Peter Freyther34a96ae2010-05-14 19:49:35 +0800678 /* nat deny is before blank/null BSC */
679 .data = bss_lu,
680 .length = sizeof(bss_lu),
681 .result = -3,
682 .nat_imsi_deny = "[0-9]*",
Holger Hans Peter Freyther19c0a842010-05-16 02:00:40 +0800683 .contype = NAT_CON_TYPE_LU,
Holger Hans Peter Freyther34a96ae2010-05-14 19:49:35 +0800684 },
685 {
Holger Hans Peter Freythera0aeaa72010-05-14 23:07:58 +0800686 /* BSC allow is before NAT deny */
Holger Hans Peter Freyther34a96ae2010-05-14 19:49:35 +0800687 .data = bss_lu,
688 .length = sizeof(bss_lu),
Holger Hans Peter Freytherd880f542010-09-15 01:42:07 +0800689 .result = 1,
Holger Hans Peter Freyther34a96ae2010-05-14 19:49:35 +0800690 .nat_imsi_deny = "[0-9]*",
Holger Hans Peter Freythera0aeaa72010-05-14 23:07:58 +0800691 .bsc_imsi_allow = "2440[0-9]*",
Holger Hans Peter Freyther19c0a842010-05-16 02:00:40 +0800692 .contype = NAT_CON_TYPE_LU,
Holger Hans Peter Freyther34a96ae2010-05-14 19:49:35 +0800693 },
694 {
695 /* BSC allow is before NAT deny */
696 .data = bss_lu,
697 .length = sizeof(bss_lu),
Holger Hans Peter Freytherd880f542010-09-15 01:42:07 +0800698 .result = 1,
Holger Hans Peter Freyther34a96ae2010-05-14 19:49:35 +0800699 .bsc_imsi_allow = "[0-9]*",
700 .nat_imsi_deny = "[0-9]*",
Holger Hans Peter Freyther19c0a842010-05-16 02:00:40 +0800701 .contype = NAT_CON_TYPE_LU,
Holger Hans Peter Freyther34a96ae2010-05-14 19:49:35 +0800702 },
703 {
704 /* filter as deny is first */
705 .data = bss_lu,
706 .length = sizeof(bss_lu),
Holger Hans Peter Freyther1fd60632010-10-19 20:55:33 +0200707 .result = 1,
Holger Hans Peter Freyther34a96ae2010-05-14 19:49:35 +0800708 .bsc_imsi_deny = "[0-9]*",
709 .bsc_imsi_allow = "[0-9]*",
710 .nat_imsi_deny = "[0-9]*",
Holger Hans Peter Freyther19c0a842010-05-16 02:00:40 +0800711 .contype = NAT_CON_TYPE_LU,
Holger Hans Peter Freyther34a96ae2010-05-14 19:49:35 +0800712 },
Holger Hans Peter Freyther1fd60632010-10-19 20:55:33 +0200713 {
714 /* deny by nat rule */
715 .data = bss_lu,
716 .length = sizeof(bss_lu),
717 .result = -3,
718 .bsc_imsi_deny = "000[0-9]*",
719 .nat_imsi_deny = "[0-9]*",
720 .contype = NAT_CON_TYPE_LU,
721 },
722 {
723 /* deny by bsc rule */
724 .data = bss_lu,
725 .length = sizeof(bss_lu),
726 .result = -2,
727 .bsc_imsi_deny = "[0-9]*",
728 .contype = NAT_CON_TYPE_LU,
729 },
Holger Hans Peter Freyther34a96ae2010-05-14 19:49:35 +0800730
731};
732
Holger Hans Peter Freyther0c08db12010-05-14 08:12:57 +0800733static void test_cr_filter()
734{
Holger Hans Peter Freyther19c0a842010-05-16 02:00:40 +0800735 int i, res, contype;
Holger Hans Peter Freyther0c08db12010-05-14 08:12:57 +0800736 struct msgb *msg = msgb_alloc(4096, "test_cr_filter");
Holger Hans Peter Freyther0c08db12010-05-14 08:12:57 +0800737 struct bsc_nat_parsed *parsed;
Holger Hans Peter Freyther29c67032010-06-08 10:14:44 +0800738 struct bsc_nat_acc_lst *nat_lst, *bsc_lst;
Holger Hans Peter Freytherd77c8172010-06-08 10:53:39 +0800739 struct bsc_nat_acc_lst_entry *nat_entry, *bsc_entry;
Holger Hans Peter Freyther0c08db12010-05-14 08:12:57 +0800740
Holger Hans Peter Freyther34a96ae2010-05-14 19:49:35 +0800741 struct bsc_nat *nat = bsc_nat_alloc();
742 struct bsc_connection *bsc = bsc_connection_alloc(nat);
Holger Hans Peter Freyther0bd60f32010-10-08 22:08:29 +0800743 bsc->cfg = bsc_config_alloc(nat, "foo");
744 bsc_config_add_lac(bsc->cfg, 1234);
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +0800745 bsc->cfg->acc_lst_name = "bsc";
746 nat->acc_lst_name = "nat";
Holger Hans Peter Freyther34a96ae2010-05-14 19:49:35 +0800747
Holger Hans Peter Freytherd77c8172010-06-08 10:53:39 +0800748 nat_lst = bsc_nat_acc_lst_get(nat, "nat");
749 bsc_lst = bsc_nat_acc_lst_get(nat, "bsc");
750
751 bsc_entry = bsc_nat_acc_lst_entry_create(bsc_lst);
752 nat_entry = bsc_nat_acc_lst_entry_create(nat_lst);
753
Holger Hans Peter Freyther34a96ae2010-05-14 19:49:35 +0800754 for (i = 0; i < ARRAY_SIZE(cr_filter); ++i) {
Holger Hans Peter Freyther749497e2010-09-29 01:19:42 +0800755 char *imsi;
Holger Hans Peter Freyther34a96ae2010-05-14 19:49:35 +0800756 msgb_reset(msg);
757 copy_to_msg(msg, cr_filter[i].data, cr_filter[i].length);
758
Holger Hans Peter Freyther29c67032010-06-08 10:14:44 +0800759 nat_lst = bsc_nat_acc_lst_get(nat, "nat");
760 bsc_lst = bsc_nat_acc_lst_get(nat, "bsc");
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +0800761
Holger Hans Peter Freytherd77c8172010-06-08 10:53:39 +0800762 bsc_parse_reg(nat_entry, &nat_entry->imsi_deny_re, &nat_entry->imsi_deny,
Holger Hans Peter Freyther34a96ae2010-05-14 19:49:35 +0800763 cr_filter[i].nat_imsi_deny ? 1 : 0,
764 &cr_filter[i].nat_imsi_deny);
Holger Hans Peter Freytherd77c8172010-06-08 10:53:39 +0800765 bsc_parse_reg(bsc_entry, &bsc_entry->imsi_allow_re, &bsc_entry->imsi_allow,
Holger Hans Peter Freyther34a96ae2010-05-14 19:49:35 +0800766 cr_filter[i].bsc_imsi_allow ? 1 : 0,
767 &cr_filter[i].bsc_imsi_allow);
Holger Hans Peter Freytherd77c8172010-06-08 10:53:39 +0800768 bsc_parse_reg(bsc_entry, &bsc_entry->imsi_deny_re, &bsc_entry->imsi_deny,
Holger Hans Peter Freyther34a96ae2010-05-14 19:49:35 +0800769 cr_filter[i].bsc_imsi_deny ? 1 : 0,
770 &cr_filter[i].bsc_imsi_deny);
771
772 parsed = bsc_nat_parse(msg);
773 if (!parsed) {
774 fprintf(stderr, "FAIL: Failed to parse the message\n");
775 abort();
776 }
777
Holger Hans Peter Freyther749497e2010-09-29 01:19:42 +0800778 res = bsc_nat_filter_sccp_cr(bsc, msg, parsed, &contype, &imsi);
Holger Hans Peter Freyther34a96ae2010-05-14 19:49:35 +0800779 if (res != cr_filter[i].result) {
780 fprintf(stderr, "FAIL: Wrong result %d for test %d.\n", res, i);
781 abort();
782 }
783
Holger Hans Peter Freyther19c0a842010-05-16 02:00:40 +0800784 if (contype != cr_filter[i].contype) {
785 fprintf(stderr, "FAIL: Wrong contype %d for test %d.\n", res, contype);
786 abort();
787 }
788
Holger Hans Peter Freyther749497e2010-09-29 01:19:42 +0800789 talloc_steal(parsed, imsi);
Holger Hans Peter Freyther34a96ae2010-05-14 19:49:35 +0800790 talloc_free(parsed);
Holger Hans Peter Freyther0c08db12010-05-14 08:12:57 +0800791 }
792
Holger Hans Peter Freyther0c08db12010-05-14 08:12:57 +0800793 msgb_free(msg);
794}
795
Holger Hans Peter Freyther32685402010-09-15 05:20:40 +0800796static void test_dt_filter()
797{
798 int i;
799 struct msgb *msg = msgb_alloc(4096, "test_dt_filter");
800 struct bsc_nat_parsed *parsed;
801
802 struct bsc_nat *nat = bsc_nat_alloc();
803 struct bsc_connection *bsc = bsc_connection_alloc(nat);
804 struct sccp_connections *con = talloc_zero(0, struct sccp_connections);
805
Holger Hans Peter Freyther0bd60f32010-10-08 22:08:29 +0800806 bsc->cfg = bsc_config_alloc(nat, "foo");
807 bsc_config_add_lac(bsc->cfg, 23);
Holger Hans Peter Freyther32685402010-09-15 05:20:40 +0800808 con->bsc = bsc;
809
810 msgb_reset(msg);
811 copy_to_msg(msg, id_resp, ARRAY_SIZE(id_resp));
812
813 parsed = bsc_nat_parse(msg);
814 if (!parsed) {
815 fprintf(stderr, "FAIL: Could not parse ID resp\n");
816 abort();
817 }
818
819 if (parsed->bssap != BSSAP_MSG_DTAP) {
820 fprintf(stderr, "FAIL: It should be dtap\n");
821 abort();
822 }
823
824 /* gsm_type is actually the size of the dtap */
825 if (parsed->gsm_type < msgb_l3len(msg) - 3) {
826 fprintf(stderr, "FAIL: Not enough space for the content\n");
827 abort();
828 }
829
830 if (bsc_nat_filter_dt(bsc, msg, con, parsed) != 1) {
831 fprintf(stderr, "FAIL: Should have passed..\n");
832 abort();
833 }
834
835 /* just some basic length checking... */
836 for (i = ARRAY_SIZE(id_resp); i >= 0; --i) {
837 msgb_reset(msg);
838 copy_to_msg(msg, id_resp, ARRAY_SIZE(id_resp));
839
840 parsed = bsc_nat_parse(msg);
841 if (!parsed)
842 continue;
843
844 con->imsi_checked = 0;
845 bsc_nat_filter_dt(bsc, msg, con, parsed);
846 }
847}
848
Holger Hans Peter Freyther73bbf892010-10-21 14:46:57 +0200849static void test_setup_rewrite()
850{
851 struct msgb *msg = msgb_alloc(4096, "test_dt_filter");
852 struct msgb *out;
853 struct bsc_nat_parsed *parsed;
854 const char *imsi = "27408000001234";
855
856 struct bsc_nat *nat = bsc_nat_alloc();
857
858 /* a fake list */
859 struct msg_entries entries;
860 struct msg_entry entry;
861
862 INIT_LLIST_HEAD(&entries.entry);
863 entry.mcc = "274";
864 entry.mnc = "08";
865 entry.option = "^0([1-9])";
866 entry.text = "0049";
867 llist_add_tail(&entry.list, &entries.entry);
868 nat->num_rewr = &entries;
869
870 /* verify that nothing changed */
871 msgb_reset(msg);
872 copy_to_msg(msg, cc_setup_international, ARRAY_SIZE(cc_setup_international));
873 parsed = bsc_nat_parse(msg);
874 if (!parsed) {
875 fprintf(stderr, "FAIL: Could not parse ID resp\n");
876 abort();
877 }
878
879 out = bsc_nat_rewrite_setup(nat, msg, parsed, imsi);
880 if (msg != out) {
881 fprintf(stderr, "FAIL: The message should not have been changed\n");
882 abort();
883 }
884
885 if (out->len != ARRAY_SIZE(cc_setup_international)) {
886 fprintf(stderr, "FAIL: Length of message changed\n");
887 abort();
888 }
889
890 if (memcmp(out->data, cc_setup_international, out->len) != 0) {
891 fprintf(stderr, "FAIL: Content modified..\n");
892 abort();
893 }
894 talloc_free(parsed);
895
896 /* verify that something in the message changes */
897 msgb_reset(msg);
898 copy_to_msg(msg, cc_setup_national, ARRAY_SIZE(cc_setup_national));
899 parsed = bsc_nat_parse(msg);
900 if (!parsed) {
901 fprintf(stderr, "FAIL: Could not parse ID resp\n");
902 abort();
903 }
904
905 out = bsc_nat_rewrite_setup(nat, msg, parsed, imsi);
906 if (!out) {
907 fprintf(stderr, "FAIL: A new message should be created.\n");
908 abort();
909 }
910
911 if (msg == out) {
912 fprintf(stderr, "FAIL: The message should have changed\n");
913 abort();
914 }
915
916 if (out->len != ARRAY_SIZE(cc_setup_national_patched)) {
917 fprintf(stderr, "FAIL: Length is wrong.\n");
918 abort();
919 }
920
921 if (memcmp(cc_setup_national_patched, out->data, out->len) != 0) {
922 fprintf(stderr, "FAIL: Data is wrong.\n");
923 fprintf(stderr, "Data was: %s\n", hexdump(out->data, out->len));
924 abort();
925 }
926
927 msgb_free(out);
Holger Hans Peter Freyther74779c62010-10-28 15:27:00 +0200928
929 /* Make sure that a wildcard is matching */
930 entry.mnc = "*";
931 msg = msgb_alloc(4096, "test_dt_filter");
932 copy_to_msg(msg, cc_setup_national, ARRAY_SIZE(cc_setup_national));
933 parsed = bsc_nat_parse(msg);
934 if (!parsed) {
935 fprintf(stderr, "FAIL: Could not parse ID resp\n");
936 abort();
937 }
938
939 out = bsc_nat_rewrite_setup(nat, msg, parsed, imsi);
940 if (!out) {
941 fprintf(stderr, "FAIL: A new message should be created.\n");
942 abort();
943 }
944
945 if (msg == out) {
946 fprintf(stderr, "FAIL: The message should have changed\n");
947 abort();
948 }
949
950 if (out->len != ARRAY_SIZE(cc_setup_national_patched)) {
951 fprintf(stderr, "FAIL: Length is wrong.\n");
952 abort();
953 }
954
955 if (memcmp(cc_setup_national_patched, out->data, out->len) != 0) {
956 fprintf(stderr, "FAIL: Data is wrong.\n");
957 fprintf(stderr, "Data was: %s\n", hexdump(out->data, out->len));
958 abort();
959 }
960
961 msgb_free(out);
962
963 /* Make sure that a wildcard is matching */
964 entry.mnc = "09";
965 msg = msgb_alloc(4096, "test_dt_filter");
966 copy_to_msg(msg, cc_setup_national, ARRAY_SIZE(cc_setup_national));
967 parsed = bsc_nat_parse(msg);
968 if (!parsed) {
969 fprintf(stderr, "FAIL: Could not parse ID resp\n");
970 abort();
971 }
972
973 out = bsc_nat_rewrite_setup(nat, msg, parsed, imsi);
974 if (out != msg) {
975 fprintf(stderr, "FAIL: The message should be unchanged.\n");
976 abort();
977 }
978
979 if (out->len != ARRAY_SIZE(cc_setup_national)) {
980 fprintf(stderr, "FAIL: Foo\n");
981 abort();
982 }
983
984 if (memcmp(out->data, cc_setup_national, ARRAY_SIZE(cc_setup_national)) != 0) {
985 fprintf(stderr, "FAIL: The message should really be unchanged.\n");
986 abort();
987 }
988
989 msgb_free(out);
Holger Hans Peter Freyther73bbf892010-10-21 14:46:57 +0200990}
991
Holger Hans Peter Freyther38f7c752010-06-15 18:48:36 +0800992int main(int argc, char **argv)
993{
Holger Hans Peter Freyther434a1fd2010-06-15 20:18:40 +0800994 struct log_target *stderr_target;
Holger Hans Peter Freyther38f7c752010-06-15 18:48:36 +0800995
Holger Hans Peter Freyther30e1ae92010-07-30 02:53:14 +0800996 sccp_set_log_area(DSCCP);
Holger Hans Peter Freytherf0945402010-07-05 13:29:42 +0800997 log_init(&log_info);
Holger Hans Peter Freyther434a1fd2010-06-15 20:18:40 +0800998 stderr_target = log_target_create_stderr();
999 log_add_target(stderr_target);
1000 log_set_all_filter(stderr_target, 1);
Holger Hans Peter Freyther38f7c752010-06-15 18:48:36 +08001001
1002 test_filter();
Holger Hans Peter Freyther04fd9922010-03-30 06:51:53 +02001003 test_contrack();
Holger Hans Peter Freyther04fd9922010-03-30 06:51:53 +02001004 test_paging();
Holger Hans Peter Freytherfc9bd232010-04-01 03:55:27 +02001005 test_mgcp_ass_tracking();
1006 test_mgcp_find();
Holger Hans Peter Freyther76c83542010-04-01 06:48:52 +02001007 test_mgcp_rewrite();
Holger Hans Peter Freyther3c3bce12010-04-01 10:16:28 +02001008 test_mgcp_parse();
Holger Hans Peter Freyther0c08db12010-05-14 08:12:57 +08001009 test_cr_filter();
Holger Hans Peter Freyther32685402010-09-15 05:20:40 +08001010 test_dt_filter();
Holger Hans Peter Freyther73bbf892010-10-21 14:46:57 +02001011 test_setup_rewrite();
Holger Hans Peter Freythera9e93312011-02-26 11:38:00 +01001012 test_mgcp_allocations();
Holger Hans Peter Freyther0b8f69d2010-06-15 18:45:38 +08001013 return 0;
1014}