diff options
-rw-r--r-- | openbsc/include/openbsc/gtphub.h | 2 | ||||
-rw-r--r-- | openbsc/src/gprs/gtphub.c | 78 | ||||
-rw-r--r-- | openbsc/src/gprs/gtphub_vty.c | 8 | ||||
-rw-r--r-- | openbsc/tests/gtphub/gtphub_test.c | 181 |
4 files changed, 144 insertions, 125 deletions
diff --git a/openbsc/include/openbsc/gtphub.h b/openbsc/include/openbsc/gtphub.h index 97cfc60e9..9cb7605f8 100644 --- a/openbsc/include/openbsc/gtphub.h +++ b/openbsc/include/openbsc/gtphub.h @@ -398,7 +398,6 @@ struct gtphub_peer_port { struct gtphub_tunnel_endpoint { struct gtphub_peer_port *peer; uint32_t tei_orig; /* from/to peer */ - uint32_t tei_repl; /* from/to the other tunnel endpoint */ struct rate_ctr_group *counters_io; }; @@ -407,6 +406,7 @@ struct gtphub_tunnel { struct llist_head entry; struct expiring_item expiry_entry; + uint32_t tei_repl; /* unique TEI to replace peers' TEIs */ struct gtphub_tunnel_endpoint endpoint[GTPH_SIDE_N][GTPH_PLANE_N]; }; diff --git a/openbsc/src/gprs/gtphub.c b/openbsc/src/gprs/gtphub.c index 24d0c5829..0218924f0 100644 --- a/openbsc/src/gprs/gtphub.c +++ b/openbsc/src/gprs/gtphub.c @@ -995,9 +995,9 @@ static const char *gtphub_tunnel_side_str(struct gtphub_tunnel *tun, APPEND("/%s", gsn_addr_to_str(&u->peer->peer_addr->addr)); } - APPEND(" (TEI C %x=%x/U %x=%x)", - c->tei_orig, c->tei_repl, - u->tei_orig, u->tei_repl); + APPEND(" (TEI C=%x U=%x)", + c->tei_orig, + u->tei_orig); return buf; } @@ -1008,6 +1008,7 @@ const char *gtphub_tunnel_str(struct gtphub_tunnel *tun) int left = sizeof(buf); int l; + APPEND("TEI=%x: ", tun->tei_repl); APPEND("%s", gtphub_tunnel_side_str(tun, GTPH_SIDE_SGSN)); APPEND(" <-> %s", gtphub_tunnel_side_str(tun, GTPH_SIDE_GGSN)); @@ -1030,12 +1031,14 @@ int gtphub_tunnel_complete(struct gtphub_tunnel *tun) { if (!tun) return 0; + if (!tun->tei_repl) + return 0; int side_idx; int plane_idx; for_each_side_and_plane(side_idx, plane_idx) { struct gtphub_tunnel_endpoint *te = &tun->endpoint[side_idx][plane_idx]; - if (!(te->peer && te->tei_orig && te->tei_repl)) + if (!(te->peer && te->tei_orig)) return 0; } return 1; @@ -1212,29 +1215,33 @@ static struct gtphub_peer_port *gtphub_unmap_seq(struct gtp_packet_desc *p, return nrm->origin; } -static int gtphub_check_mapped_tei(struct gtphub_tunnel_endpoint *new_te, - struct gtphub_tunnel_endpoint *iterated_te, +static int gtphub_check_mapped_tei(struct gtphub_tunnel *new_tun, + struct gtphub_tunnel *iterated_tun, uint32_t *tei_min, uint32_t *tei_max) { - if (!new_te->tei_repl) + if (!new_tun->tei_repl || !iterated_tun->tei_repl) return 1; - if (new_te->tei_repl != iterated_te->tei_repl) + + *tei_min = (*tei_min < iterated_tun->tei_repl)? *tei_min : iterated_tun->tei_repl; + *tei_max = (*tei_max > iterated_tun->tei_repl)? *tei_max : iterated_tun->tei_repl; + + if (new_tun->tei_repl != iterated_tun->tei_repl) return 1; - /* new_te->tei_repl is already taken. Try to find one out of the known + /* new_tun->tei_repl is already taken. Try to find one out of the known * range. */ - LOG(LOGL_DEBUG, "TEI replacement %d already taken.\n", new_te->tei_repl); + LOG(LOGL_DEBUG, "TEI replacement %d already taken.\n", new_tun->tei_repl); if ((*tei_max) < 0xffffffff) { (*tei_max)++; - new_te->tei_repl = *tei_max; - LOG(LOGL_DEBUG, "Using TEI %d instead.\n", new_te->tei_repl); + new_tun->tei_repl = *tei_max; + LOG(LOGL_DEBUG, "Using TEI %d instead.\n", new_tun->tei_repl); return 1; } else if ((*tei_min) > 1) { (*tei_min)--; - new_te->tei_repl = *tei_min; - LOG(LOGL_DEBUG, "Using TEI %d instead.\n", new_te->tei_repl); + new_tun->tei_repl = *tei_min; + LOG(LOGL_DEBUG, "Using TEI %d instead.\n", new_tun->tei_repl); return 1; } @@ -1249,8 +1256,6 @@ static int gtphub_check_reused_teis(struct gtphub *hub, uint32_t tei_max = 0; int side_idx; int plane_idx; - int side_idx2; - int plane_idx2; struct gtphub_tunnel_endpoint *te; struct gtphub_tunnel_endpoint *te2; @@ -1303,23 +1308,14 @@ static int gtphub_check_reused_teis(struct gtphub *hub, if (tun_continue) continue; - /* Check whether the mapped TEIs assigned to the endpoints are - * used anywhere else. */ - for_each_side_and_plane(side_idx, plane_idx) { - te = &tun->endpoint[side_idx][plane_idx]; - tei_min = (tei_min < te->tei_repl)? tei_min : te->tei_repl; - tei_max = (tei_max > te->tei_repl)? tei_max : te->tei_repl; - - for_each_side_and_plane(side_idx2, plane_idx2) { - te2 = &new_tun->endpoint[side_idx2][plane_idx2]; - if (!gtphub_check_mapped_tei(te2, te, &tei_min, &tei_max)) { - LOG(LOGL_ERROR, - "No mapped TEI is readily available." - " Searching for holes between occupied" - " TEIs not implemented."); - return 0; - } - } + /* Check whether the mapped TEI is already used by another + * tunnel. */ + if (!gtphub_check_mapped_tei(new_tun, tun, &tei_min, &tei_max)) { + LOG(LOGL_ERROR, + "No mapped TEI is readily available." + " Searching for holes between occupied" + " TEIs not implemented."); + return 0; } } @@ -1350,7 +1346,7 @@ static struct gtphub_tunnel_endpoint *gtphub_unmap_tei(struct gtphub *hub, &tun->endpoint[p->side_idx][p->plane_idx]; struct gtphub_tunnel_endpoint *te_to = &tun->endpoint[other_side][p->plane_idx]; - if ((te_to->tei_repl == p->header_tei_rx) + if ((tun->tei_repl == p->header_tei_rx) && te_from->peer && gsn_addr_same(&te_from->peer->peer_addr->addr, &from->peer_addr->addr)) { @@ -1453,6 +1449,10 @@ static int gtphub_handle_create_pdp_ctx(struct gtphub *hub, /* A new tunnel. */ p->tun = tun = gtphub_tunnel_new(); + + /* Create TEI mapping */ + tun->tei_repl = nr_pool_next(&hub->tei_pool); + llist_add(&tun->entry, &hub->tunnels); gtphub_tunnel_refresh(hub, tun, p->timestamp); /* The endpoint peers on this side (SGSN) will be set from IEs @@ -1471,8 +1471,7 @@ static int gtphub_handle_create_pdp_ctx(struct gtphub *hub, * TEI and be available in tun (== p->tun). Just fill in the * GSN Addresses below.*/ OSMO_ASSERT(tun); - OSMO_ASSERT(tun->endpoint[other_side_idx(p->side_idx)][GTPH_PLANE_CTRL].tei_repl - == p->header_tei_rx); + OSMO_ASSERT(tun->tei_repl == p->header_tei_rx); OSMO_ASSERT(to_ctrl); } @@ -1555,12 +1554,9 @@ static int gtphub_handle_create_pdp_ctx(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); - + /* Replace TEI in GTP packet IE */ tun->endpoint[side_idx][plane_idx].tei_orig = tei_from_ie; - tun->endpoint[side_idx][plane_idx].tei_repl = mapped_tei; - p->ie[ie_idx]->tv4.v = hton32(mapped_tei); + p->ie[ie_idx]->tv4.v = hton32(tun->tei_repl); if (!gtphub_check_reused_teis(hub, tun)) { /* It's highly unlikely that all TEIs are diff --git a/openbsc/src/gprs/gtphub_vty.c b/openbsc/src/gprs/gtphub_vty.c index 5b9fc79b2..9e3c5e012 100644 --- a/openbsc/src/gprs/gtphub_vty.c +++ b/openbsc/src/gprs/gtphub_vty.c @@ -398,8 +398,8 @@ static void show_tunnels_all(struct vty *vty, int with_io_stats) time_t now = gtphub_now(); vty_out(vty, "All tunnels%s:%s" - "Legend: (expiry in minutes) SGSN <-> GGSN, with each:%s" - " <IP-Ctrl>[/<IP-User>] (<TEI-Ctrl>=<mapped>/<TEI-User>=<mapped>)%s", + "Legend: TEI=<hex>: SGSN <-> GGSN (expiry in minutes), with each:%s" + " <IP-Ctrl>[/<IP-User>] (TEI C=<TEI-Ctrl-hex> U=<TEI-User-hex>)%s", with_io_stats? "with I/O stats" : "", VTY_NEWLINE, VTY_NEWLINE, VTY_NEWLINE); @@ -408,9 +408,9 @@ static void show_tunnels_all(struct vty *vty, int with_io_stats) struct gtphub_tunnel *tun; llist_for_each_entry(tun, &g_hub->tunnels, entry) { vty_out(vty, - "(%4dm) %s%s", - (int)((tun->expiry_entry.expiry - now) / 60), + "%s (expiry in %dm)%s", gtphub_tunnel_str(tun), + (int)((tun->expiry_entry.expiry - now) / 60), VTY_NEWLINE); count ++; if (!gtphub_tunnel_complete(tun)) diff --git a/openbsc/tests/gtphub/gtphub_test.c b/openbsc/tests/gtphub/gtphub_test.c index 098027850..fa9ad8bb7 100644 --- a/openbsc/tests/gtphub/gtphub_test.c +++ b/openbsc/tests/gtphub/gtphub_test.c @@ -929,8 +929,8 @@ static int create_pdp_ctx() "6d31", /* mapped seq ("abcd") */ "23", "42000121436587f9", - "00000002", /* mapped TEI Data I ("123") */ - "00000001", /* mapped TEI Control ("321") */ + "00000001", /* Data I: tunnel's TEI */ + "00000001", /* Control: tunnel's TEI */ "0009""08696e7465726e6574", "0004""7f000201", /* replaced with gtphub's ggsn ctrl */ "0004""7f000202" /* replaced with gtphub's ggsn user */ @@ -943,8 +943,9 @@ 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=2)" - " <-> 192.168.43.34/(uninitialized) (TEI C 0=0/U 0=0)" + "TEI=1:" + " 192.168.42.23 (TEI C=321 U=123)" + " <-> 192.168.43.34/(uninitialized) (TEI C=0 U=0)" " @21945\n")); const char *gtp_resp_from_ggsn = @@ -962,8 +963,8 @@ static int create_pdp_ctx() "00000321", /* unmapped TEI ("001") */ "abcd", /* unmapped seq ("6d31") */ "23", - "00000004", /* mapped TEI from GGSN ("567") */ - "00000003", /* mapped TEI from GGSN ("765") */ + "00000001", /* mapped TEI from GGSN ("567") */ + "00000001", /* mapped TEI from GGSN ("765") */ "0004""7f000101", /* gtphub's address towards SGSNs (Ctrl) */ "0004""7f000102" /* gtphub's address towards SGSNs (User) */ ); @@ -1007,12 +1008,13 @@ static int delete_pdp_ctx_from_sgsn(void) gtphub_gc(hub, now); LVL2_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)" + "TEI=1:" + " 192.168.42.23 (TEI C=321 U=123)" + " <-> 192.168.43.34 (TEI C=765 U=567)" " @21945\n")); /* TEI Ctrl from above and next sequence after abcd. */ - const char *gtp_req_from_sgsn = MSG_DEL_PDP_CTX_REQ("00000003", "abce"); + const char *gtp_req_from_sgsn = MSG_DEL_PDP_CTX_REQ("00000001", "abce"); const char *gtp_req_to_ggsn = MSG_DEL_PDP_CTX_REQ("00000765", "6d32"); LVL2_ASSERT(msg_from_sgsn_c(&sgsn_sender, @@ -1022,8 +1024,9 @@ static int delete_pdp_ctx_from_sgsn(void) /* 21945 + 31 = 21976 */ LVL2_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)" + "TEI=1:" + " 192.168.42.23 (TEI C=321 U=123)" + " <-> 192.168.43.34 (TEI C=765 U=567)" " @21976\n")); const char *gtp_resp_from_ggsn = @@ -1049,8 +1052,9 @@ static int delete_pdp_ctx_from_ggsn(void) gtphub_gc(hub, now); LVL2_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)" + "TEI=1:" + " 192.168.42.23 (TEI C=321 U=123)" + " <-> 192.168.43.34 (TEI C=765 U=567)" " @21945\n")); /* TEI Ctrl from above and next sequence after abcd. */ @@ -1064,12 +1068,13 @@ static int delete_pdp_ctx_from_ggsn(void) /* 21945 + 31 = 21976 */ LVL2_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)" + "TEI=1:" + " 192.168.42.23 (TEI C=321 U=123)" + " <-> 192.168.43.34 (TEI C=765 U=567)" " @21976\n")); const char *gtp_resp_from_sgsn = - MSG_DEL_PDP_CTX_RSP("00000003", "6d31"); + MSG_DEL_PDP_CTX_RSP("00000001", "6d31"); const char *gtp_resp_to_ggsn = MSG_DEL_PDP_CTX_RSP("00000765", "5432"); @@ -1112,8 +1117,9 @@ static void test_one_pdp_ctx(int del_from_side) * 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=2)" - " <-> 192.168.43.34 (TEI C 765=3/U 567=4)" + "TEI=1:" + " 192.168.42.23 (TEI C=321 U=123)" + " <-> 192.168.43.34 (TEI C=765 U=567)" " @21945\n")); if (del_from_side == GTPH_SIDE_SGSN) { @@ -1136,8 +1142,9 @@ 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=2)" - " <-> 192.168.43.34 (TEI C 765=3/U 567=4)" + "TEI=1:" + " 192.168.42.23 (TEI C=321 U=123)" + " <-> 192.168.43.34 (TEI C=765 U=567)" " @21945\n")); LOG("- user data starts"); @@ -1152,7 +1159,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 */ - "00000002" /* mapped User TEI for SGSN from create_pdp_ctx() */ + "00000001" /* mapped TEI for SGSN from create_pdp_ctx() */ "0070" /* seq */ "0000" /* No extensions */ /* User data (ICMP packet), 96 - 12 = 84 octets */ @@ -1182,15 +1189,16 @@ 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=2)" - " <-> 192.168.43.34 (TEI C 765=3/U 567=4)" + "TEI=1:" + " 192.168.42.23 (TEI C=321 U=123)" + " <-> 192.168.43.34 (TEI C=765 U=567)" " @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() */ + "00000001" /* mapped User TEI for GGSN from create_pdp_ctx() */ "1234" /* unknown seq */ "0000" /* No extensions */ /* User data (ICMP packet), 96 - 12 = 84 octets */ @@ -1218,8 +1226,9 @@ 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=2)" - " <-> 192.168.43.34 (TEI C 765=3/U 567=4)" + "TEI=1:" + " 192.168.42.23 (TEI C=321 U=123)" + " <-> 192.168.43.34 (TEI C=765 U=567)" " @22545\n")); OSMO_ASSERT(clear_test_hub()); @@ -1249,8 +1258,8 @@ static void test_reused_tei(void) "6d32", /* mapped seq ("abce") */ "23", "42000121436587f9", - "00000006", /* mapped TEI Data I ("123") */ - "00000005", /* mapped TEI Control ("321") */ + "00000002", /* mapped TEI Data I ("123") */ + "00000002", /* mapped TEI Control ("321") */ "0009""08696e7465726e6574", "0004""7f000201", /* replaced with gtphub's ggsn ctrl */ "0004""7f000202" /* replaced with gtphub's ggsn user */ @@ -1263,13 +1272,14 @@ static void test_reused_tei(void) OSMO_ASSERT(was_resolved_for("240010123456789", "internet")); OSMO_ASSERT(tunnels_are( - "192.168.42.23 (TEI C 321=5/U 123=6)" - " <-> 192.168.43.34/(uninitialized) (TEI C 0=0/U 0=0)" + "TEI=2:" + " 192.168.42.23 (TEI C=321 U=123)" + " <-> 192.168.43.34/(uninitialized) (TEI C=0 U=0)" " @21945\n")); const char *gtp_resp_from_ggsn = MSG_PDP_CTX_RSP("004e", - "00000005", /* destination TEI (sent in req above) */ + "00000002", /* destination TEI (sent in req above) */ "6d32", /* mapped seq */ "01", /* restart */ "00000567", /* TEI U */ @@ -1282,8 +1292,8 @@ static void test_reused_tei(void) "00000321", /* unmapped TEI ("001") */ "abce", /* unmapped seq ("6d32") */ "23", - "00000008", /* mapped TEI from GGSN ("567") */ - "00000007", /* mapped TEI from GGSN ("765") */ + "00000002", /* mapped TEI from GGSN ("567") */ + "00000002", /* mapped TEI from GGSN ("765") */ "0004""7f000101", /* gtphub's address towards SGSNs (Ctrl) */ "0004""7f000102" /* gtphub's address towards SGSNs (User) */ ); @@ -1323,8 +1333,8 @@ static void test_peer_restarted(void) "6d33", /* mapped seq ("1234") */ "23", "42000121436587f9", - "00000006", /* mapped TEI Data I ("123") */ - "00000005", /* mapped TEI Control ("321") */ + "00000002", /* mapped TEI Data I ("123") */ + "00000002", /* mapped TEI Control ("321") */ "0009""08696e7465726e6574", "0004""7f000201", /* replaced with gtphub's ggsn ctrl */ "0004""7f000202" /* replaced with gtphub's ggsn user */ @@ -1337,17 +1347,19 @@ static void test_peer_restarted(void) OSMO_ASSERT(was_resolved_for("240010123456789", "internet")); OSMO_ASSERT(tunnels_are( - "192.168.42.23 (TEI C cba=5/U abc=6)" - " <-> 192.168.43.34/(uninitialized) (TEI C 0=0/U 0=0)" + "TEI=2:" + " 192.168.42.23 (TEI C=cba U=abc)" + " <-> 192.168.43.34/(uninitialized) (TEI C=0 U=0)" " @21955\n" - "(uninitialized) (TEI C 321=1/U 123=2)" - " <-> 192.168.43.34 (TEI C 765=3/U 567=4)" + "TEI=1:" + " (uninitialized) (TEI C=321 U=123)" + " <-> 192.168.43.34 (TEI C=765 U=567)" " @21945\n" )); const char *gtp_resp_from_ggsn = MSG_PDP_CTX_RSP("004e", - "00000005", /* destination TEI (sent in req above) */ + "00000002", /* destination TEI (sent in req above) */ "6d33", /* mapped seq */ "01", /* restart */ "00000def", /* TEI U */ @@ -1360,8 +1372,8 @@ static void test_peer_restarted(void) "00000cba", /* unmapped TEI ("005") */ "1234", /* unmapped seq ("6d32") */ "23", - "00000008", /* mapped TEI from GGSN ("567") */ - "00000007", /* mapped TEI from GGSN ("765") */ + "00000002", /* mapped TEI from GGSN ("567") */ + "00000002", /* mapped TEI from GGSN ("765") */ "0004""7f000101", /* gtphub's address towards SGSNs (Ctrl) */ "0004""7f000102" /* gtphub's address towards SGSNs (User) */ ); @@ -1401,8 +1413,8 @@ static void test_peer_restarted_reusing_tei(void) "6d32", /* mapped seq ("1234") */ "23", "42000121436587f9", - "00000006", /* mapped TEI Data I ("123") */ - "00000005", /* mapped TEI Control ("321") */ + "00000002", /* mapped TEI Data I ("123") */ + "00000002", /* mapped TEI Control ("321") */ "0009""08696e7465726e6574", "0004""7f000201", /* replaced with gtphub's ggsn ctrl */ "0004""7f000202" /* replaced with gtphub's ggsn user */ @@ -1415,14 +1427,15 @@ static void test_peer_restarted_reusing_tei(void) OSMO_ASSERT(was_resolved_for("240010123456789", "internet")); OSMO_ASSERT(tunnels_are( - "192.168.42.23 (TEI C 321=5/U 123=6)" - " <-> 192.168.43.34/(uninitialized) (TEI C 0=0/U 0=0)" + "TEI=2:" + " 192.168.42.23 (TEI C=321 U=123)" + " <-> 192.168.43.34/(uninitialized) (TEI C=0 U=0)" " @21955\n" )); const char *gtp_resp_from_ggsn = MSG_PDP_CTX_RSP("004e", - "00000005", /* destination TEI (sent in req above) */ + "00000002", /* destination TEI (sent in req above) */ "6d32", /* mapped seq */ "01", /* restart */ "00000def", /* TEI U */ @@ -1435,8 +1448,8 @@ static void test_peer_restarted_reusing_tei(void) "00000321", /* unmapped TEI ("005") */ "1234", /* unmapped seq ("6d32") */ "23", - "00000008", /* mapped TEI from GGSN ("567") */ - "00000007", /* mapped TEI from GGSN ("765") */ + "00000002", /* mapped TEI from GGSN ("567") */ + "00000002", /* mapped TEI from GGSN ("765") */ "0004""7f000101", /* gtphub's address towards SGSNs (Ctrl) */ "0004""7f000102" /* gtphub's address towards SGSNs (User) */ ); @@ -1462,8 +1475,9 @@ static void test_sgsn_behind_nat(void) /* 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)" + "TEI=1:" + " 192.168.42.23 (TEI C=321 U=123)" + " <-> 192.168.43.34 (TEI C=765 U=567)" " @21945\n")); LOG("- user data starts"); @@ -1477,7 +1491,7 @@ static void test_sgsn_behind_nat(void) "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() */ + "00000001" /* mapped User TEI for SGSN from create_pdp_ctx() */ "0070" /* seq */ "0000" /* No extensions */ /* User data (ICMP packet), 96 - 12 = 84 octets */ @@ -1507,15 +1521,16 @@ static void test_sgsn_behind_nat(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=2)" - " <-> 192.168.43.34 (TEI C 765=3/U 567=4)" + "TEI=1:" + " 192.168.42.23 (TEI C=321 U=123)" + " <-> 192.168.43.34 (TEI C=765 U=567)" " @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() */ + "00000001" /* mapped User TEI for GGSN from create_pdp_ctx() */ "1234" /* unknown seq */ "0000" /* No extensions */ /* User data (ICMP packet), 96 - 12 = 84 octets */ @@ -1543,8 +1558,9 @@ static void test_sgsn_behind_nat(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=2)" - " <-> 192.168.43.34 (TEI C 765=3/U 567=4)" + "TEI=1:" + " 192.168.42.23 (TEI C=321 U=123)" + " <-> 192.168.43.34 (TEI C=765 U=567)" " @22545\n")); OSMO_ASSERT(clear_test_hub()); @@ -1572,7 +1588,7 @@ void test_parallel_context_creation(void) "6d31", /* mapped seq ("abcd") */ "23", "42000121436587f9", - "00000002", /* mapped TEI Data I ("123") */ + "00000001", /* mapped TEI Data I ("123") */ "00000001", /* mapped TEI Control ("321") */ "0009""08696e7465726e6574", "0004""7f000201", /* replaced with gtphub's ggsn ctrl */ @@ -1585,8 +1601,9 @@ void test_parallel_context_creation(void) gtp_req_to_ggsn1)); OSMO_ASSERT(tunnels_are( - "192.168.42.23 (TEI C 321=1/U 123=2)" - " <-> 192.168.43.34/(uninitialized) (TEI C 0=0/U 0=0)" + "TEI=1:" + " 192.168.42.23 (TEI C=321 U=123)" + " <-> 192.168.43.34/(uninitialized) (TEI C=0 U=0)" " @21945\n")); now ++; @@ -1607,8 +1624,8 @@ void test_parallel_context_creation(void) "6d32", /* mapped seq ("abce") */ "23", "42000121436588f9", - "00000004", /* mapped TEI Data I ("124") */ - "00000003", /* mapped TEI Control ("322") */ + "00000002", /* mapped TEI Data I ("124") */ + "00000002", /* mapped TEI Control ("322") */ "0009""08696e7465726e6574", "0004""7f000201", /* replaced with gtphub's ggsn ctrl */ "0004""7f000202" /* replaced with gtphub's ggsn user */ @@ -1620,11 +1637,13 @@ void test_parallel_context_creation(void) gtp_req_to_ggsn2)); OSMO_ASSERT(tunnels_are( - "192.168.42.23 (TEI C 322=3/U 124=4)" - " <-> 192.168.43.34/(uninitialized) (TEI C 0=0/U 0=0)" + "TEI=2:" + " 192.168.42.23 (TEI C=322 U=124)" + " <-> 192.168.43.34/(uninitialized) (TEI C=0 U=0)" " @21946\n" - "192.168.42.23 (TEI C 321=1/U 123=2)" - " <-> 192.168.43.34/(uninitialized) (TEI C 0=0/U 0=0)" + "TEI=1:" + " 192.168.42.23 (TEI C=321 U=123)" + " <-> 192.168.43.34/(uninitialized) (TEI C=0 U=0)" " @21945\n" )); @@ -1645,8 +1664,8 @@ void test_parallel_context_creation(void) "00000321", /* unmapped TEI ("001") */ "abcd", /* unmapped seq ("6d31") */ "23", - "00000006", /* mapped TEI from GGSN ("567") */ - "00000005", /* mapped TEI from GGSN ("765") */ + "00000001", /* mapped TEI from GGSN ("567") */ + "00000001", /* mapped TEI from GGSN ("765") */ "0004""7f000101", /* gtphub's address towards SGSNs (Ctrl) */ "0004""7f000102" /* gtphub's address towards SGSNs (User) */ ); @@ -1657,11 +1676,13 @@ void test_parallel_context_creation(void) gtp_resp_to_sgsn1)); OSMO_ASSERT(tunnels_are( - "192.168.42.23 (TEI C 322=3/U 124=4)" - " <-> 192.168.43.34/(uninitialized) (TEI C 0=0/U 0=0)" + "TEI=2:" + " 192.168.42.23 (TEI C=322 U=124)" + " <-> 192.168.43.34/(uninitialized) (TEI C=0 U=0)" " @21946\n" - "192.168.42.23 (TEI C 321=1/U 123=2)" - " <-> 192.168.43.34 (TEI C 765=5/U 567=6)" + "TEI=1:" + " 192.168.42.23 (TEI C=321 U=123)" + " <-> 192.168.43.34 (TEI C=765 U=567)" " @21947\n" )); @@ -1669,7 +1690,7 @@ void test_parallel_context_creation(void) const char *gtp_resp_from_ggsn2 = MSG_PDP_CTX_RSP("004e", - "00000003", /* destination TEI (sent in req above) */ + "00000002", /* destination TEI (sent in req above) */ "6d32", /* mapped seq */ "01", /* restart */ "00000568", /* TEI U */ @@ -1682,8 +1703,8 @@ void test_parallel_context_creation(void) "00000322", /* unmapped TEI ("001") */ "abce", /* unmapped seq ("6d31") */ "23", - "00000008", /* mapped TEI from GGSN ("567") */ - "00000007", /* mapped TEI from GGSN ("765") */ + "00000002", /* mapped TEI from GGSN ("567") */ + "00000002", /* mapped TEI from GGSN ("765") */ "0004""7f000101", /* gtphub's address towards SGSNs (Ctrl) */ "0004""7f000102" /* gtphub's address towards SGSNs (User) */ ); @@ -1694,11 +1715,13 @@ void test_parallel_context_creation(void) gtp_resp_to_sgsn2)); OSMO_ASSERT(tunnels_are( - "192.168.42.23 (TEI C 322=3/U 124=4)" - " <-> 192.168.43.34 (TEI C 766=7/U 568=8)" + "TEI=2:" + " 192.168.42.23 (TEI C=322 U=124)" + " <-> 192.168.43.34 (TEI C=766 U=568)" " @21948\n" - "192.168.42.23 (TEI C 321=1/U 123=2)" - " <-> 192.168.43.34 (TEI C 765=5/U 567=6)" + "TEI=1:" + " 192.168.42.23 (TEI C=321 U=123)" + " <-> 192.168.43.34 (TEI C=765 U=567)" " @21947\n" )); |