blob: 24b96012a82fb58515077a573731077a530f81c0 [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
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License along
20 * with this program; if not, write to the Free Software Foundation, Inc.,
21 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
22 *
23 */
24
25
26#include <openbsc/debug.h>
27#include <openbsc/gsm_data.h>
28#include <openbsc/bsc_nat.h>
29
Holger Hans Peter Freyther38f7c752010-06-15 18:48:36 +080030#include <osmocore/talloc.h>
31
Holger Hans Peter Freyther0b8f69d2010-06-15 18:45:38 +080032#include <stdio.h>
33
34/* test messages for ipa */
35static u_int8_t ipa_id[] = {
36 0x00, 0x01, 0xfe, 0x06,
37};
38
39/* SCCP messages are below */
40static u_int8_t gsm_reset[] = {
41 0x00, 0x12, 0xfd,
42 0x09, 0x00, 0x03, 0x05, 0x07, 0x02, 0x42, 0xfe,
43 0x02, 0x42, 0xfe, 0x06, 0x00, 0x04, 0x30, 0x04,
44 0x01, 0x20,
45};
46
47static const u_int8_t gsm_reset_ack[] = {
48 0x00, 0x13, 0xfd,
49 0x09, 0x00, 0x03, 0x07, 0x0b, 0x04, 0x43, 0x01,
50 0x00, 0xfe, 0x04, 0x43, 0x5c, 0x00, 0xfe, 0x03,
51 0x00, 0x01, 0x31,
52};
53
54static const u_int8_t gsm_paging[] = {
55 0x00, 0x20, 0xfd,
56 0x09, 0x00, 0x03, 0x07, 0x0b, 0x04, 0x43, 0x01,
57 0x00, 0xfe, 0x04, 0x43, 0x5c, 0x00, 0xfe, 0x10,
58 0x00, 0x0e, 0x52, 0x08, 0x08, 0x29, 0x47, 0x10,
59 0x02, 0x01, 0x31, 0x97, 0x61, 0x1a, 0x01, 0x06,
60};
61
62/* BSC -> MSC connection open */
63static const u_int8_t bssmap_cr[] = {
64 0x00, 0x2c, 0xfd,
65 0x01, 0x01, 0x02, 0x03, 0x02, 0x02, 0x04, 0x02,
66 0x42, 0xfe, 0x0f, 0x1f, 0x00, 0x1d, 0x57, 0x05,
67 0x08, 0x00, 0x72, 0xf4, 0x80, 0x20, 0x12, 0xc3,
68 0x50, 0x17, 0x10, 0x05, 0x24, 0x11, 0x03, 0x33,
69 0x19, 0xa2, 0x08, 0x29, 0x47, 0x10, 0x02, 0x01,
70 0x31, 0x97, 0x61, 0x00
71};
72
73/* MSC -> BSC connection confirm */
74static const u_int8_t bssmap_cc[] = {
75 0x00, 0x0a, 0xfd,
76 0x02, 0x01, 0x02, 0x03, 0x00, 0x00, 0x03, 0x02, 0x01, 0x00,
77};
78
79/* MSC -> BSC released */
80static const u_int8_t bssmap_released[] = {
81 0x00, 0x0e, 0xfd,
82 0x04, 0x00, 0x00, 0x03, 0x01, 0x02, 0x03, 0x00, 0x01, 0x0f,
83 0x02, 0x23, 0x42, 0x00,
84};
85
86/* BSC -> MSC released */
87static const u_int8_t bssmap_release_complete[] = {
88 0x00, 0x07, 0xfd,
89 0x05, 0x01, 0x02, 0x03, 0x00, 0x00, 0x03
90};
91
Holger Hans Peter Freyther0a6f62f2010-04-06 10:22:01 +020092/* both directions IT timer */
93static const u_int8_t connnection_it[] = {
94 0x00, 0x0b, 0xfd,
95 0x10, 0x01, 0x02, 0x03, 0x01, 0x02, 0x03,
96 0x00, 0x00, 0x00, 0x00,
97};
98
Holger Hans Peter Freyther5e63f922010-04-21 15:45:26 +080099/* error in both directions */
100static const u_int8_t proto_error[] = {
101 0x00, 0x05, 0xfd,
102 0x0f, 0x22, 0x33, 0x44, 0x00,
103};
104
Holger Hans Peter Freythera128d912010-04-01 08:47:12 +0200105/* MGCP wrap... */
106static const u_int8_t mgcp_msg[] = {
107 0x00, 0x03, 0xfc,
108 0x20, 0x20, 0x20,
109};
110
Holger Hans Peter Freyther0b8f69d2010-06-15 18:45:38 +0800111struct filter_result {
112 const u_int8_t *data;
113 const u_int16_t length;
Holger Hans Peter Freyther1d6fb182010-01-30 11:53:30 +0100114 const int dir;
Holger Hans Peter Freyther0b8f69d2010-06-15 18:45:38 +0800115 const int result;
116};
117
118static const struct filter_result results[] = {
119 {
120 .data = ipa_id,
121 .length = ARRAY_SIZE(ipa_id),
Holger Hans Peter Freyther1d6fb182010-01-30 11:53:30 +0100122 .dir = DIR_MSC,
123 .result = 1,
Holger Hans Peter Freyther0b8f69d2010-06-15 18:45:38 +0800124 },
125 {
126 .data = gsm_reset,
127 .length = ARRAY_SIZE(gsm_reset),
Holger Hans Peter Freyther1d6fb182010-01-30 11:53:30 +0100128 .dir = DIR_MSC,
129 .result = 1,
Holger Hans Peter Freyther0b8f69d2010-06-15 18:45:38 +0800130 },
131 {
132 .data = gsm_reset_ack,
133 .length = ARRAY_SIZE(gsm_reset_ack),
Holger Hans Peter Freyther1d6fb182010-01-30 11:53:30 +0100134 .dir = DIR_BSC,
135 .result = 1,
Holger Hans Peter Freyther0b8f69d2010-06-15 18:45:38 +0800136 },
137 {
138 .data = gsm_paging,
139 .length = ARRAY_SIZE(gsm_paging),
Holger Hans Peter Freyther1d6fb182010-01-30 11:53:30 +0100140 .dir = DIR_BSC,
141 .result = 0,
Holger Hans Peter Freyther0b8f69d2010-06-15 18:45:38 +0800142 },
143 {
144 .data = bssmap_cr,
145 .length = ARRAY_SIZE(bssmap_cr),
Holger Hans Peter Freyther1d6fb182010-01-30 11:53:30 +0100146 .dir = DIR_MSC,
147 .result = 0,
Holger Hans Peter Freyther0b8f69d2010-06-15 18:45:38 +0800148 },
149 {
150 .data = bssmap_cc,
151 .length = ARRAY_SIZE(bssmap_cc),
Holger Hans Peter Freyther1d6fb182010-01-30 11:53:30 +0100152 .dir = DIR_BSC,
153 .result = 0,
Holger Hans Peter Freyther0b8f69d2010-06-15 18:45:38 +0800154 },
155 {
156 .data = bssmap_released,
157 .length = ARRAY_SIZE(bssmap_released),
Holger Hans Peter Freyther1d6fb182010-01-30 11:53:30 +0100158 .dir = DIR_MSC,
159 .result = 0,
Holger Hans Peter Freyther0b8f69d2010-06-15 18:45:38 +0800160 },
161 {
162 .data = bssmap_release_complete,
163 .length = ARRAY_SIZE(bssmap_release_complete),
Holger Hans Peter Freyther1d6fb182010-01-30 11:53:30 +0100164 .dir = DIR_BSC,
165 .result = 0,
Holger Hans Peter Freyther0b8f69d2010-06-15 18:45:38 +0800166 },
Holger Hans Peter Freythera128d912010-04-01 08:47:12 +0200167 {
168 .data = mgcp_msg,
169 .length = ARRAY_SIZE(mgcp_msg),
170 .dir = DIR_MSC,
171 .result = 0,
172 },
Holger Hans Peter Freyther0a6f62f2010-04-06 10:22:01 +0200173 {
174 .data = connnection_it,
175 .length = ARRAY_SIZE(connnection_it),
176 .dir = DIR_BSC,
177 .result = 0,
178 },
179 {
180 .data = connnection_it,
181 .length = ARRAY_SIZE(connnection_it),
182 .dir = DIR_MSC,
183 .result = 0,
184 },
Holger Hans Peter Freyther5e63f922010-04-21 15:45:26 +0800185 {
186 .data = proto_error,
187 .length = ARRAY_SIZE(proto_error),
188 .dir = DIR_BSC,
189 .result = 0,
190 },
191 {
192 .data = proto_error,
193 .length = ARRAY_SIZE(proto_error),
194 .dir = DIR_MSC,
195 .result = 0,
196 },
197
Holger Hans Peter Freyther0b8f69d2010-06-15 18:45:38 +0800198};
199
Holger Hans Peter Freyther38f7c752010-06-15 18:48:36 +0800200static void test_filter(void)
Holger Hans Peter Freyther0b8f69d2010-06-15 18:45:38 +0800201{
202 int i;
203
204
205 /* start testinh with proper messages */
Holger Hans Peter Freyther38f7c752010-06-15 18:48:36 +0800206 fprintf(stderr, "Testing BSS Filtering.\n");
Holger Hans Peter Freyther0b8f69d2010-06-15 18:45:38 +0800207 for (i = 0; i < ARRAY_SIZE(results); ++i) {
208 int result;
209 struct bsc_nat_parsed *parsed;
210 struct msgb *msg = msgb_alloc(4096, "test-message");
211
212 fprintf(stderr, "Going to test item: %d\n", i);
213 memcpy(msg->data, results[i].data, results[i].length);
214 msg->l2h = msgb_put(msg, results[i].length);
215
216 parsed = bsc_nat_parse(msg);
217 if (!parsed) {
218 fprintf(stderr, "FAIL: Failed to parse the message\n");
219 continue;
220 }
221
Holger Hans Peter Freyther1d6fb182010-01-30 11:53:30 +0100222 result = bsc_nat_filter_ipa(results[i].dir, msg, parsed);
Holger Hans Peter Freyther0b8f69d2010-06-15 18:45:38 +0800223 if (result != results[i].result) {
224 fprintf(stderr, "FAIL: Not the expected result got: %d wanted: %d\n",
225 result, results[i].result);
226 }
227
228 msgb_free(msg);
229 }
Holger Hans Peter Freyther38f7c752010-06-15 18:48:36 +0800230}
Holger Hans Peter Freyther0b8f69d2010-06-15 18:45:38 +0800231
Holger Hans Peter Freyther38f7c752010-06-15 18:48:36 +0800232#include "bsc_data.c"
233
234static void copy_to_msg(struct msgb *msg, const u_int8_t *data, unsigned int length)
235{
236 msgb_reset(msg);
237 msg->l2h = msgb_put(msg, length);
238 memcpy(msg->l2h, data, msgb_l2len(msg));
239}
240
241#define VERIFY(con_found, con, msg, ver, str) \
Holger Hans Peter Freyther49c7fb52010-06-15 18:48:55 +0800242 if (!con_found || con_found->bsc != con) { \
Holger Hans Peter Freyther72ba1622010-06-15 18:48:44 +0800243 fprintf(stderr, "Failed to find the con: %p\n", con_found); \
Holger Hans Peter Freyther38f7c752010-06-15 18:48:36 +0800244 abort(); \
245 } \
246 if (memcmp(msg->data, ver, sizeof(ver)) != 0) { \
247 fprintf(stderr, "Failed to patch the %s msg.\n", str); \
248 abort(); \
249 }
250
251/* test conn tracking once */
252static void test_contrack()
253{
254 int rc;
255 struct bsc_nat *nat;
Holger Hans Peter Freyther49c7fb52010-06-15 18:48:55 +0800256 struct bsc_connection *con;
257 struct sccp_connections *con_found;
Holger Hans Peter Freyther38f7c752010-06-15 18:48:36 +0800258 struct bsc_nat_parsed *parsed;
259 struct msgb *msg;
260
261 fprintf(stderr, "Testing connection tracking.\n");
262 nat = bsc_nat_alloc();
263 con = bsc_connection_alloc(nat);
Holger Hans Peter Freytherc87c8b72010-04-18 02:30:57 +0800264 con->cfg = bsc_config_alloc(nat, "foo", 23);
Holger Hans Peter Freyther38f7c752010-06-15 18:48:36 +0800265 msg = msgb_alloc(4096, "test");
266
267 /* 1.) create a connection */
268 copy_to_msg(msg, bsc_cr, sizeof(bsc_cr));
269 parsed = bsc_nat_parse(msg);
Holger Hans Peter Freytherb5513ca2010-04-21 18:56:12 +0800270 con_found = patch_sccp_src_ref_to_msc(msg, parsed, con);
Holger Hans Peter Freyther38f7c752010-06-15 18:48:36 +0800271 if (con_found != NULL) {
Holger Hans Peter Freyther72ba1622010-06-15 18:48:44 +0800272 fprintf(stderr, "Con should not exist %p\n", con_found);
Holger Hans Peter Freyther38f7c752010-06-15 18:48:36 +0800273 abort();
274 }
275 rc = create_sccp_src_ref(con, msg, parsed);
276 if (rc != 0) {
277 fprintf(stderr, "Failed to create a ref\n");
278 abort();
279 }
Holger Hans Peter Freytherb5513ca2010-04-21 18:56:12 +0800280 con_found = patch_sccp_src_ref_to_msc(msg, parsed, con);
Holger Hans Peter Freyther49c7fb52010-06-15 18:48:55 +0800281 if (!con_found || con_found->bsc != con) {
Holger Hans Peter Freyther72ba1622010-06-15 18:48:44 +0800282 fprintf(stderr, "Failed to find the con: %p\n", con_found);
Holger Hans Peter Freyther38f7c752010-06-15 18:48:36 +0800283 abort();
284 }
285 if (memcmp(msg->data, bsc_cr_patched, sizeof(bsc_cr_patched)) != 0) {
286 fprintf(stderr, "Failed to patch the BSC CR msg.\n");
287 abort();
288 }
289 talloc_free(parsed);
290
291 /* 2.) get the cc */
292 copy_to_msg(msg, msc_cc, sizeof(msc_cc));
293 parsed = bsc_nat_parse(msg);
Holger Hans Peter Freyther49c7fb52010-06-15 18:48:55 +0800294 con_found = patch_sccp_src_ref_to_bsc(msg, parsed, nat);
295 VERIFY(con_found, con, msg, msc_cc_patched, "MSC CC");
296 if (update_sccp_src_ref(con_found, parsed) != 0) {
Holger Hans Peter Freyther38f7c752010-06-15 18:48:36 +0800297 fprintf(stderr, "Failed to update the SCCP con.\n");
298 abort();
299 }
Holger Hans Peter Freyther38f7c752010-06-15 18:48:36 +0800300
301 /* 3.) send some data */
302 copy_to_msg(msg, bsc_dtap, sizeof(bsc_dtap));
303 parsed = bsc_nat_parse(msg);
Holger Hans Peter Freytherb5513ca2010-04-21 18:56:12 +0800304 con_found = patch_sccp_src_ref_to_msc(msg, parsed, con);
Holger Hans Peter Freyther38f7c752010-06-15 18:48:36 +0800305 VERIFY(con_found, con, msg, bsc_dtap_patched, "BSC DTAP");
306
307 /* 4.) receive some data */
308 copy_to_msg(msg, msc_dtap, sizeof(msc_dtap));
309 parsed = bsc_nat_parse(msg);
310 con_found = patch_sccp_src_ref_to_bsc(msg, parsed, nat);
311 VERIFY(con_found, con, msg, msc_dtap_patched, "MSC DTAP");
312
313 /* 5.) close the connection */
314 copy_to_msg(msg, msc_rlsd, sizeof(msc_rlsd));
315 parsed = bsc_nat_parse(msg);
316 con_found = patch_sccp_src_ref_to_bsc(msg, parsed, nat);
317 VERIFY(con_found, con, msg, msc_rlsd_patched, "MSC RLSD");
318
319 /* 6.) confirm the connection close */
320 copy_to_msg(msg, bsc_rlc, sizeof(bsc_rlc));
321 parsed = bsc_nat_parse(msg);
Holger Hans Peter Freytherb5513ca2010-04-21 18:56:12 +0800322 con_found = patch_sccp_src_ref_to_msc(msg, parsed, con);
Holger Hans Peter Freyther49c7fb52010-06-15 18:48:55 +0800323 if (!con_found || con_found->bsc != con) {
Holger Hans Peter Freyther72ba1622010-06-15 18:48:44 +0800324 fprintf(stderr, "Failed to find the con: %p\n", con_found);
Holger Hans Peter Freyther38f7c752010-06-15 18:48:36 +0800325 abort();
326 }
327 if (memcmp(msg->data, bsc_rlc_patched, sizeof(bsc_rlc_patched)) != 0) {
328 fprintf(stderr, "Failed to patch the BSC CR msg.\n");
329 abort();
330 }
331 remove_sccp_src_ref(con, msg, parsed);
Holger Hans Peter Freyther9d518552010-04-05 21:44:51 +0200332 talloc_free(parsed);
333
334 copy_to_msg(msg, bsc_rlc, sizeof(bsc_rlc));
335 parsed = bsc_nat_parse(msg);
Holger Hans Peter Freytherb5513ca2010-04-21 18:56:12 +0800336 con_found = patch_sccp_src_ref_to_msc(msg, parsed, con);
Holger Hans Peter Freyther38f7c752010-06-15 18:48:36 +0800337
338 /* verify that it is gone */
339 if (con_found != NULL) {
Holger Hans Peter Freyther72ba1622010-06-15 18:48:44 +0800340 fprintf(stderr, "Con should be gone. %p\n", con_found);
Holger Hans Peter Freyther38f7c752010-06-15 18:48:36 +0800341 abort();
342 }
343 talloc_free(parsed);
344
345
346 talloc_free(nat);
347 msgb_free(msg);
348}
349
Holger Hans Peter Freyther04fd9922010-03-30 06:51:53 +0200350static void test_paging(void)
351{
Holger Hans Peter Freyther979a3092010-04-17 08:07:19 +0200352 int lac;
Holger Hans Peter Freyther04fd9922010-03-30 06:51:53 +0200353 struct bsc_nat *nat;
354 struct bsc_connection *con;
355 struct bsc_nat_parsed *parsed;
Holger Hans Peter Freyther47dd4942010-04-06 15:11:34 +0200356 struct bsc_config cfg;
Holger Hans Peter Freyther04fd9922010-03-30 06:51:53 +0200357 struct msgb *msg;
358
359 fprintf(stderr, "Testing paging by lac.\n");
360
361 nat = bsc_nat_alloc();
362 con = bsc_connection_alloc(nat);
Holger Hans Peter Freyther47dd4942010-04-06 15:11:34 +0200363 con->cfg = &cfg;
364 cfg.lac = 23;
Holger Hans Peter Freyther04fd9922010-03-30 06:51:53 +0200365 con->authenticated = 1;
366 llist_add(&con->list_entry, &nat->bsc_connections);
367 msg = msgb_alloc(4096, "test");
368
369 /* Test completely bad input */
370 copy_to_msg(msg, paging_by_lac_cmd, sizeof(paging_by_lac_cmd));
Holger Hans Peter Freyther979a3092010-04-17 08:07:19 +0200371 if (bsc_nat_find_bsc(nat, msg, &lac) != 0) {
Holger Hans Peter Freyther04fd9922010-03-30 06:51:53 +0200372 fprintf(stderr, "Should have not found anything.\n");
373 abort();
374 }
375
376 /* Test it by not finding it */
377 copy_to_msg(msg, paging_by_lac_cmd, sizeof(paging_by_lac_cmd));
378 parsed = bsc_nat_parse(msg);
Holger Hans Peter Freyther979a3092010-04-17 08:07:19 +0200379 if (bsc_nat_find_bsc(nat, msg, &lac) != 0) {
Holger Hans Peter Freyther04fd9922010-03-30 06:51:53 +0200380 fprintf(stderr, "Should have not found aynthing.\n");
381 abort();
382 }
383 talloc_free(parsed);
384
385 /* Test by finding it */
Holger Hans Peter Freyther47dd4942010-04-06 15:11:34 +0200386 cfg.lac = 8213;
Holger Hans Peter Freyther04fd9922010-03-30 06:51:53 +0200387 copy_to_msg(msg, paging_by_lac_cmd, sizeof(paging_by_lac_cmd));
388 parsed = bsc_nat_parse(msg);
Holger Hans Peter Freyther979a3092010-04-17 08:07:19 +0200389 if (bsc_nat_find_bsc(nat, msg, &lac) != con) {
Holger Hans Peter Freyther04fd9922010-03-30 06:51:53 +0200390 fprintf(stderr, "Should have found it.\n");
391 abort();
392 }
393 talloc_free(parsed);
394}
395
Holger Hans Peter Freytherfc9bd232010-04-01 03:55:27 +0200396static void test_mgcp_ass_tracking(void)
Holger Hans Peter Freyther465313e2010-06-15 18:49:53 +0800397{
Holger Hans Peter Freyther7b7eef62010-04-22 12:08:17 +0800398 struct bsc_connection *bsc;
399 struct bsc_nat *nat;
Holger Hans Peter Freyther465313e2010-06-15 18:49:53 +0800400 struct sccp_connections con;
401 struct bsc_nat_parsed *parsed;
402 struct msgb *msg;
403
404 fprintf(stderr, "Testing MGCP.\n");
405 memset(&con, 0, sizeof(con));
406
Holger Hans Peter Freyther7b7eef62010-04-22 12:08:17 +0800407 nat = bsc_nat_alloc();
408 nat->bsc_endpoints = talloc_zero_array(nat,
409 struct bsc_endpoint,
410 33);
411 bsc = bsc_connection_alloc(nat);
412 bsc->cfg = bsc_config_alloc(nat, "foo", 2323);
413 con.bsc = bsc;
414
Holger Hans Peter Freyther465313e2010-06-15 18:49:53 +0800415 msg = msgb_alloc(4096, "foo");
416 copy_to_msg(msg, ass_cmd, sizeof(ass_cmd));
417 parsed = bsc_nat_parse(msg);
418 if (bsc_mgcp_assign(&con, msg) != 0) {
419 fprintf(stderr, "Failed to handle assignment.\n");
420 abort();
421 }
422
423 if (con.msc_timeslot != 21) {
424 fprintf(stderr, "Timeslot should be 21.\n");
425 abort();
426 }
427
428 if (con.bsc_timeslot != 21) {
429 fprintf(stderr, "Assigned timeslot should have been 21.\n");
430 abort();
431 }
432 talloc_free(parsed);
433
Holger Hans Peter Freyther7b7eef62010-04-22 12:08:17 +0800434 bsc_mgcp_dlcx(&con);
Holger Hans Peter Freyther465313e2010-06-15 18:49:53 +0800435 if (con.bsc_timeslot != -1 || con.msc_timeslot != -1) {
436 fprintf(stderr, "Clearing should remove the mapping.\n");
437 abort();
438 }
Holger Hans Peter Freyther7b7eef62010-04-22 12:08:17 +0800439
440 talloc_free(nat);
Holger Hans Peter Freyther465313e2010-06-15 18:49:53 +0800441}
442
Holger Hans Peter Freytherfc9bd232010-04-01 03:55:27 +0200443/* test the code to find a given connection */
444static void test_mgcp_find(void)
445{
446 struct bsc_nat *nat;
447 struct bsc_connection *con;
448 struct sccp_connections *sccp_con;
449
450 fprintf(stderr, "Testing finding of a BSC Connection\n");
451
452 nat = bsc_nat_alloc();
453 con = bsc_connection_alloc(nat);
454 llist_add(&con->list_entry, &nat->bsc_connections);
455
456 sccp_con = talloc_zero(con, struct sccp_connections);
457 sccp_con->msc_timeslot = 12;
458 sccp_con->bsc_timeslot = 12;
459 sccp_con->bsc = con;
460 llist_add(&sccp_con->list_entry, &nat->sccp_connections);
461
462 if (bsc_mgcp_find_con(nat, 11) != NULL) {
463 fprintf(stderr, "Found the wrong connection.\n");
464 abort();
465 }
466
Holger Hans Peter Freyther08a1b162010-04-18 02:26:16 +0800467 if (bsc_mgcp_find_con(nat, 12) != sccp_con) {
Holger Hans Peter Freytherfc9bd232010-04-01 03:55:27 +0200468 fprintf(stderr, "Didn't find the connection\n");
469 abort();
470 }
471
472 sccp_con->msc_timeslot = 0;
473 sccp_con->bsc_timeslot = 0;
Holger Hans Peter Freyther08a1b162010-04-18 02:26:16 +0800474 if (bsc_mgcp_find_con(nat, 1) != sccp_con) {
Holger Hans Peter Freytherfc9bd232010-04-01 03:55:27 +0200475 fprintf(stderr, "Didn't find the connection\n");
476 abort();
477 }
478
479 /* free everything */
480 talloc_free(nat);
481}
482
Holger Hans Peter Freyther76c83542010-04-01 06:48:52 +0200483static void test_mgcp_rewrite(void)
484{
485 int i;
Holger Hans Peter Freyther8d200652010-04-04 18:09:10 +0200486 struct msgb *output;
Holger Hans Peter Freyther76c83542010-04-01 06:48:52 +0200487 fprintf(stderr, "Test rewriting MGCP messages.\n");
488
Holger Hans Peter Freyther76c83542010-04-01 06:48:52 +0200489 for (i = 0; i < ARRAY_SIZE(mgcp_messages); ++i) {
490 const char *orig = mgcp_messages[i].orig;
491 const char *patc = mgcp_messages[i].patch;
492 const char *ip = mgcp_messages[i].ip;
493 const int port = mgcp_messages[i].port;
494
Holger Hans Peter Freyther8d200652010-04-04 18:09:10 +0200495 char *input = strdup(orig);
Holger Hans Peter Freyther76c83542010-04-01 06:48:52 +0200496
Holger Hans Peter Freyther8d200652010-04-04 18:09:10 +0200497 output = bsc_mgcp_rewrite(input, strlen(input), ip, port);
Holger Hans Peter Freyther76c83542010-04-01 06:48:52 +0200498 if (msgb_l2len(output) != strlen(patc)) {
499 fprintf(stderr, "Wrong sizes for test: %d %d != %d != %d\n", i, msgb_l2len(output), strlen(patc), strlen(orig));
500 fprintf(stderr, "String '%s' vs '%s'\n", (const char *) output->l2h, patc);
501 abort();
502 }
503
504 if (memcmp(output->l2h, patc, msgb_l2len(output)) != 0) {
505 fprintf(stderr, "Broken on %d msg: '%s'\n", i, (const char *) output->l2h);
506 abort();
507 }
508
509 msgb_free(output);
Holger Hans Peter Freyther8d200652010-04-04 18:09:10 +0200510 free(input);
Holger Hans Peter Freyther76c83542010-04-01 06:48:52 +0200511 }
Holger Hans Peter Freyther76c83542010-04-01 06:48:52 +0200512}
513
Holger Hans Peter Freyther3c3bce12010-04-01 10:16:28 +0200514static void test_mgcp_parse(void)
515{
516 int code, ci;
517 char transaction[60];
518
519 fprintf(stderr, "Test MGCP response parsing.\n");
520
521 if (bsc_mgcp_parse_response(crcx_resp, &code, transaction) != 0) {
522 fprintf(stderr, "Failed to parse CRCX resp.\n");
523 abort();
524 }
525
526 if (code != 200) {
527 fprintf(stderr, "Failed to parse the CODE properly. Got: %d\n", code);
528 abort();
529 }
530
531 if (strcmp(transaction, "23265295") != 0) {
532 fprintf(stderr, "Failed to parse transaction id: '%s'\n", transaction);
533 abort();
534 }
535
536 ci = bsc_mgcp_extract_ci(crcx_resp);
537 if (ci != 1) {
538 fprintf(stderr, "Failed to parse the CI. Got: %d\n", ci);
539 abort();
540 }
541}
542
Holger Hans Peter Freyther38f7c752010-06-15 18:48:36 +0800543int main(int argc, char **argv)
544{
545 struct debug_target *stderr_target;
546
547 stderr_target = debug_target_create_stderr();
548 debug_add_target(stderr_target);
549 debug_set_all_filter(stderr_target, 1);
550
551 test_filter();
Holger Hans Peter Freyther04fd9922010-03-30 06:51:53 +0200552 test_contrack();
Holger Hans Peter Freyther04fd9922010-03-30 06:51:53 +0200553 test_paging();
Holger Hans Peter Freytherfc9bd232010-04-01 03:55:27 +0200554 test_mgcp_ass_tracking();
555 test_mgcp_find();
Holger Hans Peter Freyther76c83542010-04-01 06:48:52 +0200556 test_mgcp_rewrite();
Holger Hans Peter Freyther3c3bce12010-04-01 10:16:28 +0200557 test_mgcp_parse();
Holger Hans Peter Freyther0b8f69d2010-06-15 18:45:38 +0800558 return 0;
559}
Holger Hans Peter Freyther38f7c752010-06-15 18:48:36 +0800560
561void input_event()
562{}
563int nm_state_event()
564{
565 return -1;
566}
567
568int gsm0408_rcvmsg(struct msgb *msg, u_int8_t link_id)
569{
570 return -1;
571}