From f8c701008b578e51cc370dbf0115890fdd333cbe Mon Sep 17 00:00:00 2001 From: Neels Hofmeyr Date: Thu, 3 Dec 2015 14:29:48 +0100 Subject: gtphub: add test for SGSN behind NAT --- openbsc/tests/gtphub/gtphub_test.c | 101 ++++++++++++++++++++++++++++++++++++ openbsc/tests/gtphub/gtphub_test.ok | 4 ++ 2 files changed, 105 insertions(+) diff --git a/openbsc/tests/gtphub/gtphub_test.c b/openbsc/tests/gtphub/gtphub_test.c index 4281303e9..bdce99d7f 100644 --- a/openbsc/tests/gtphub/gtphub_test.c +++ b/openbsc/tests/gtphub/gtphub_test.c @@ -1450,6 +1450,106 @@ static void test_peer_restarted_reusing_tei(void) OSMO_ASSERT(clear_test_hub()); } +static void test_sgsn_behind_nat(void) +{ + LOG("test_user_data"); + + OSMO_ASSERT(setup_test_hub()); + hub->sgsn_use_sender = 1; /* <-- Main difference to test_user_data() */ + resolve_to_sgsn("192.168.42.23", 423); /* Same as sender */ + + OSMO_ASSERT(create_pdp_ctx()); + + /* now == 345; now + (6 * 60 * 60) == 21600 + 345 == 21945. */ + OSMO_ASSERT(tunnels_are( + "192.168.42.23 (TEI C 321=1 / U 123=2)" + " <-> 192.168.43.34 (TEI C 765=3 / U 567=4)" + " @21945\n")); + + LOG("- user data starts"); + /* Now expect default port numbers for User plane -- except SGSN. */ + resolve_to_ggsn("192.168.43.34", 2152); + + /* 10 minutes later */ + now += 600; + + const char *u_from_ggsn = + "32" /* 0b001'1 0010: version 1, protocol GTP, with seq nr */ + "ff" /* type 255: G-PDU */ + "0058" /* length: 88 + 8 octets == 96 */ + "00000002" /* mapped User TEI for SGSN from create_pdp_ctx() */ + "0070" /* seq */ + "0000" /* No extensions */ + /* User data (ICMP packet), 96 - 12 = 84 octets */ + "45000054daee40004001f7890a172a010a172a02080060d23f590071e3f8" + "4156000000007241010000000000101112131415161718191a1b1c1d1e1f" + "202122232425262728292a2b2c2d2e2f3031323334353637" + ; + const char *u_to_sgsn = + "32" /* 0b001'1 0010: version 1, protocol GTP, with seq nr */ + "ff" /* type 255: G-PDU */ + "0058" /* length: 88 + 8 octets == 96 */ + "00000123" /* unmapped User TEI */ + "6d31" /* new mapped seq */ + "0000" + "45000054daee40004001f7890a172a010a172a02080060d23f590071e3f8" + "4156000000007241010000000000101112131415161718191a1b1c1d1e1f" + "202122232425262728292a2b2c2d2e2f3031323334353637" + ; + + /* This depends on create_pdp_ctx() sending resolved_sgsn_addr as GSN + * Address IEs in the GGSN's Create PDP Ctx Response. */ + OSMO_ASSERT(msg_from_ggsn_u(&ggsn_sender, + &resolved_sgsn_addr, + u_from_ggsn, + u_to_sgsn)); + + /* Make sure the user plane messages have refreshed the TEI mapping + * timeouts: 21945 + 600 == 22545. */ + OSMO_ASSERT(tunnels_are( + "192.168.42.23 (TEI C 321=1 / U 123=2)" + " <-> 192.168.43.34 (TEI C 765=3 / U 567=4)" + " @22545\n")); + + const char *u_from_sgsn = + "32" /* 0b001'1 0010: version 1, protocol GTP, with seq nr */ + "ff" /* type 255: G-PDU */ + "0058" /* length: 88 + 8 octets == 96 */ + "00000004" /* mapped User TEI for GGSN from create_pdp_ctx() */ + "1234" /* unknown seq */ + "0000" /* No extensions */ + /* User data (ICMP packet), 96 - 12 = 84 octets */ + "45000054daee40004001f7890a172a010a172a02080060d23f590071e3f8" + "4156000000007241010000000000101112131415161718191a1b1c1d1e1f" + "202122232425262728292a2b2c2d2e2f3031323334353637" + ; + const char *u_to_ggsn = + "32" /* 0b001'1 0010: version 1, protocol GTP, with seq nr */ + "ff" /* type 255: G-PDU */ + "0058" /* length: 88 + 8 octets == 96 */ + "00000567" /* unmapped User TEI */ + "6d31" /* unmapped seq */ + "0000" + "45000054daee40004001f7890a172a010a172a02080060d23f590071e3f8" + "4156000000007241010000000000101112131415161718191a1b1c1d1e1f" + "202122232425262728292a2b2c2d2e2f3031323334353637" + ; + + OSMO_ASSERT(msg_from_sgsn_u(&sgsn_sender, + &resolved_ggsn_addr, + u_from_sgsn, + u_to_ggsn)); + + /* Make sure the user plane messages have refreshed the TEI mapping + * timeouts: 21945 + 600 == 22545. Both timeouts refreshed: */ + OSMO_ASSERT(tunnels_are( + "192.168.42.23 (TEI C 321=1 / U 123=2)" + " <-> 192.168.43.34 (TEI C 765=3 / U 567=4)" + " @22545\n")); + + OSMO_ASSERT(clear_test_hub()); +} + static struct log_info_cat gtphub_categories[] = { [DGTPHUB] = { @@ -1480,6 +1580,7 @@ int main(int argc, char **argv) test_reused_tei(); test_peer_restarted(); test_peer_restarted_reusing_tei(); + test_sgsn_behind_nat(); printf("Done\n"); talloc_report_full(osmo_gtphub_ctx, stderr); diff --git a/openbsc/tests/gtphub/gtphub_test.ok b/openbsc/tests/gtphub/gtphub_test.ok index be9e19f08..1faea408a 100644 --- a/openbsc/tests/gtphub/gtphub_test.ok +++ b/openbsc/tests/gtphub/gtphub_test.ok @@ -27,4 +27,8 @@ test_peer_restarted_reusing_tei returning GGSN addr from imsi 240010123456789 ni internet: 192.168.43.34 port 2123 - __wrap_gtphub_resolve_ggsn_addr(): returning GGSN addr from imsi 240010123456789 ni internet: 192.168.43.34 port 2123 +test_user_data +- __wrap_gtphub_resolve_ggsn_addr(): + returning GGSN addr from imsi 240010123456789 ni internet: 192.168.43.34 port 2123 +- user data starts Done -- cgit v1.2.3