diff options
author | Neels Hofmeyr <nhofmeyr@sysmocom.de> | 2015-11-27 01:20:53 +0100 |
---|---|---|
committer | Neels Hofmeyr <nhofmeyr@sysmocom.de> | 2015-12-03 11:40:22 +0100 |
commit | d121ea612460b8a6f78a3bc91ab164651240f48a (patch) | |
tree | bc6e97a5f07ed02569f79d7de4b1df79f4428842 | |
parent | f977320736fe15ffc3a0e6110bec7823a57c65ee (diff) |
gtphub: use a single TEI pool across planes.
There's no need to keep two separate number pools when both can be fed
from the same pool. User and Ctrl plane TEIs can technically overlap without
colliding, but it doesn't hurt if they don't overlap, either.
Sponsored-by: On-Waves ehi
-rw-r--r-- | openbsc/include/openbsc/gtphub.h | 2 | ||||
-rw-r--r-- | openbsc/src/gprs/gtphub.c | 6 | ||||
-rw-r--r-- | openbsc/tests/gtphub/gtphub_test.c | 28 |
3 files changed, 18 insertions, 18 deletions
diff --git a/openbsc/include/openbsc/gtphub.h b/openbsc/include/openbsc/gtphub.h index 2d9d39000..a142867d6 100644 --- a/openbsc/include/openbsc/gtphub.h +++ b/openbsc/include/openbsc/gtphub.h @@ -444,7 +444,7 @@ struct gtphub { * uint32_t; if a new TEI were mapped every second, this would take * more than 100 years (in which a single given TEI must not time out) * to cause a problem. */ - struct nr_pool tei_pool[GTPH_PLANE_N]; + struct nr_pool tei_pool; struct llist_head tunnels; /* struct gtphub_tunnel */ diff --git a/openbsc/src/gprs/gtphub.c b/openbsc/src/gprs/gtphub.c index 4f81c017f..5807f5f58 100644 --- a/openbsc/src/gprs/gtphub.c +++ b/openbsc/src/gprs/gtphub.c @@ -1449,7 +1449,7 @@ static int gtphub_handle_pdp_ctx_ies(struct gtphub *hub, if (tei_from_ie) { /* Create TEI mapping and replace in GTP packet IE */ - uint32_t mapped_tei = nr_pool_next(&hub->tei_pool[plane_idx]); + uint32_t mapped_tei = nr_pool_next(&hub->tei_pool); tun->endpoint[side_idx][plane_idx].tei_orig = tei_from_ie; tun->endpoint[side_idx][plane_idx].tei_repl = mapped_tei; @@ -2105,10 +2105,10 @@ void gtphub_init(struct gtphub *hub) expiry_init(&hub->expire_quickly, GTPH_EXPIRE_QUICKLY_SECS); expiry_init(&hub->expire_slowly, GTPH_EXPIRE_SLOWLY_MINUTES * 60); + nr_pool_init(&hub->tei_pool, 1, 0xffffffff); + int plane_idx; for_each_plane(plane_idx) { - nr_pool_init(&hub->tei_pool[plane_idx], 1, 0xffffffff); - gtphub_bind_init(&hub->to_ggsns[plane_idx]); gtphub_bind_init(&hub->to_sgsns[plane_idx]); } diff --git a/openbsc/tests/gtphub/gtphub_test.c b/openbsc/tests/gtphub/gtphub_test.c index 9ba464382..8347f3b74 100644 --- a/openbsc/tests/gtphub/gtphub_test.c +++ b/openbsc/tests/gtphub/gtphub_test.c @@ -906,7 +906,7 @@ static int create_pdp_ctx() "6d31", /* mapped seq ("abcd") */ "23", "42000121436587f9", - "00000001", /* mapped TEI Data I ("123") */ + "00000002", /* mapped TEI Data I ("123") */ "00000001", /* mapped TEI Control ("321") */ "0009""08696e7465726e6574", "0004""7f000201", /* replaced with gtphub's ggsn ctrl */ @@ -920,7 +920,7 @@ static int create_pdp_ctx() LVL2_ASSERT(was_resolved_for("240010123456789", "internet")); LVL2_ASSERT(tunnels_are( - "192.168.42.23 (TEI C 321=1 / U 123=1)" + "192.168.42.23 (TEI C 321=1 / U 123=2)" " <-> 192.168.43.34 / (uninitialized) (TEI C 0=0 / U 0=0)" " @21945\n")); @@ -939,8 +939,8 @@ static int create_pdp_ctx() "00000321", /* unmapped TEI ("001") */ "abcd", /* unmapped seq ("6d31") */ "23", - "00000002", /* mapped TEI from GGSN ("567") */ - "00000002", /* mapped TEI from GGSN ("765") */ + "00000004", /* mapped TEI from GGSN ("567") */ + "00000003", /* mapped TEI from GGSN ("765") */ "0004""7f000101", /* gtphub's address towards SGSNs (Ctrl) */ "0004""7f000102" /* gtphub's address towards SGSNs (User) */ ); @@ -979,8 +979,8 @@ static void test_create_pdp_ctx(void) * 0x00000567 == 1383 (TEI from GGSN User) * Mapped TEIs should be 1 and 2. */ OSMO_ASSERT(tunnels_are( - "192.168.42.23 (TEI C 321=1 / U 123=1)" - " <-> 192.168.43.34 (TEI C 765=2 / U 567=2)" + "192.168.42.23 (TEI C 321=1 / U 123=2)" + " <-> 192.168.43.34 (TEI C 765=3 / U 567=4)" " @21945\n")); OSMO_ASSERT(clear_test_hub()); } @@ -995,8 +995,8 @@ static void test_user_data(void) /* now == 345; now + (6 * 60 * 60) == 21600 + 345 == 21945. */ OSMO_ASSERT(tunnels_are( - "192.168.42.23 (TEI C 321=1 / U 123=1)" - " <-> 192.168.43.34 (TEI C 765=2 / U 567=2)" + "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"); @@ -1011,7 +1011,7 @@ static void test_user_data(void) "32" /* 0b001'1 0010: version 1, protocol GTP, with seq nr */ "ff" /* type 255: G-PDU */ "0058" /* length: 88 + 8 octets == 96 */ - "00000001" /* mapped User TEI for SGSN from create_pdp_ctx() */ + "00000002" /* mapped User TEI for SGSN from create_pdp_ctx() */ "0070" /* seq */ "0000" /* No extensions */ /* User data (ICMP packet), 96 - 12 = 84 octets */ @@ -1041,15 +1041,15 @@ static void test_user_data(void) /* 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=1)" - " <-> 192.168.43.34 (TEI C 765=2 / U 567=2)" + "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 */ - "00000002" /* mapped User TEI for GGSN from create_pdp_ctx() */ + "00000004" /* mapped User TEI for GGSN from create_pdp_ctx() */ "6d31" /* mapped seq */ "0000" /* No extensions */ /* User data (ICMP packet), 96 - 12 = 84 octets */ @@ -1077,8 +1077,8 @@ static void test_user_data(void) /* 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=1)" - " <-> 192.168.43.34 (TEI C 765=2 / U 567=2)" + "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()); |