diff options
author | Neels Hofmeyr <neels@hofmeyr.de> | 2018-03-13 17:52:07 +0100 |
---|---|---|
committer | Neels Hofmeyr <neels@hofmeyr.de> | 2018-03-13 18:10:32 +0100 |
commit | 212e54cec1b42839a0f055185b6cc99977041108 (patch) | |
tree | 910538b4e2f335acd80f4131142d9bd91c486df2 | |
parent | 5222d8f3bfe67d327c0fb577aff9b7b2cc21364c (diff) |
msc_vlr_test_call: reproduce OS#3062neels/os3062
Change-Id: Ice7197b48d4e163a3c4d97b559fdcd7e88c4107e
-rw-r--r-- | tests/msc_vlr/msc_vlr_test_call.c | 80 | ||||
-rw-r--r-- | tests/msc_vlr/msc_vlr_tests.c | 7 | ||||
-rw-r--r-- | tests/msc_vlr/msc_vlr_tests.h | 2 |
3 files changed, 89 insertions, 0 deletions
diff --git a/tests/msc_vlr/msc_vlr_test_call.c b/tests/msc_vlr/msc_vlr_test_call.c index 42d55bf11..e3f2e4e17 100644 --- a/tests/msc_vlr/msc_vlr_test_call.c +++ b/tests/msc_vlr/msc_vlr_test_call.c @@ -31,6 +31,12 @@ static void mncc_sends_to_cc(uint32_t msg_type, struct gsm_mncc *mncc) mncc_tx_to_cc(net, msg_type, mncc); } +static void on_call_release_mncc_sends_to_cc(uint32_t msg_type, struct gsm_mncc *mncc) +{ + mncc->msg_type = msg_type; + on_call_release_mncc_sends_to_cc_data = mncc; +} + #define IMSI "901700000010650" static void standard_lu() @@ -334,8 +340,82 @@ static void test_call_mt() comment_end(); } +static void test_call_mt2() +{ + struct gsm_mncc mncc = { + .imsi = IMSI, + .callref = 0x423, + }; + + comment_start(); + + fake_time_start(); + + standard_lu(); + + BTW("after a while, MNCC asks us to setup a call, causing Paging"); + + paging_expect_imsi(IMSI); + paging_sent = false; + mncc_sends_to_cc(MNCC_SETUP_REQ, &mncc); + + VERBOSE_ASSERT(paging_sent, == true, "%d"); + VERBOSE_ASSERT(paging_stopped, == false, "%d"); + + btw("MS replies with Paging Response, and VLR sends Auth Request"); + auth_request_sent = false; + auth_request_expect_rand = "c187a53a5e6b9d573cac7c74451fd46d"; + auth_request_expect_autn = "1843a645b98d00005b2d666af46c45d9"; + ms_sends_msg("062707" + "03575886" /* classmark 2 */ + "089910070000106005" /* IMSI */); + VERBOSE_ASSERT(auth_request_sent, == true, "%d"); + + btw("MS sends Authen Response, VLR accepts and sends SecurityModeControl"); + expect_security_mode_ctrl(NULL, "1159ec926a50e98c034a6b7d7c9f418d"); + ms_sends_msg("0554" "7db47cf7" "2104" "f81e4dc7"); /* 2nd vector's res, s.a. */ + VERBOSE_ASSERT(security_mode_ctrl_sent, == true, "%d"); + + btw("MS sends SecurityModeControl acceptance, VLR accepts, sends CC Setup"); + dtap_expect_tx("0305" /* CC: Setup */); + ms_sends_security_mode_complete(); + VERBOSE_ASSERT(paging_stopped, == true, "%d"); + + cc_to_mncc_expect_tx(IMSI, MNCC_CALL_CONF_IND); + ms_sends_msg("8348" /* CC: Call Confirmed */ + "0406600402000581" /* Bearer Capability */ + "15020100" /* Call Control Capabilities */ + "40080402600400021f00" /* Supported Codec List */); + OSMO_ASSERT(cc_to_mncc_tx_confirmed); + + fake_time_passes(1, 23); + + cc_to_mncc_expect_tx("", MNCC_ALERT_IND); + ms_sends_msg("8381" /* CC: Alerting */); + OSMO_ASSERT(cc_to_mncc_tx_confirmed); + + fake_time_passes(15, 23); + + btw("The call failed, the BSC sends a BSSMAP Clear Request"); + on_call_release_mncc_sends_to_cc(MNCC_REL_REQ, &mncc); + cc_to_mncc_expect_tx("", MNCC_REL_CNF); + dtap_expect_tx("032d"); /* CC: Release */ + expect_iu_release(); + msc_clear_request(g_conn, 0); + OSMO_ASSERT(cc_to_mncc_tx_confirmed); + OSMO_ASSERT(iu_release_sent); + + EXPECT_CONN_COUNT(0); + + fake_time_passes(15, 23); + + clear_vlr(); + comment_end(); +} + msc_vlr_test_func_t msc_vlr_tests[] = { test_call_mo, test_call_mt, + test_call_mt2, NULL }; diff --git a/tests/msc_vlr/msc_vlr_tests.c b/tests/msc_vlr/msc_vlr_tests.c index 4c51790cf..8dc412a41 100644 --- a/tests/msc_vlr/msc_vlr_tests.c +++ b/tests/msc_vlr/msc_vlr_tests.c @@ -618,12 +618,19 @@ int __wrap_msc_mgcp_call_assignment(struct gsm_trans *trans) return 0; } +struct gsm_mncc *on_call_release_mncc_sends_to_cc_data = NULL; + /* override, requires '-Wl,--wrap=msc_mgcp_call_release' */ void __real_msc_mgcp_call_release(struct gsm_trans *trans); void __wrap_msc_mgcp_call_release(struct gsm_trans *trans) { log("MS <--Call Release-- MSC: subscr=%s callref=0x%x", vlr_subscr_name(trans->vsub), trans->callref); + if (on_call_release_mncc_sends_to_cc_data) { + mncc_tx_to_cc(trans->net, on_call_release_mncc_sends_to_cc_data->msg_type, + on_call_release_mncc_sends_to_cc_data); + on_call_release_mncc_sends_to_cc_data = NULL; + } } static int fake_vlr_tx_lu_acc(void *msc_conn_ref, uint32_t send_tmsi) diff --git a/tests/msc_vlr/msc_vlr_tests.h b/tests/msc_vlr/msc_vlr_tests.h index 858936c1c..15df9ec78 100644 --- a/tests/msc_vlr/msc_vlr_tests.h +++ b/tests/msc_vlr/msc_vlr_tests.h @@ -112,6 +112,8 @@ extern const char *cc_to_mncc_tx_expected_imsi; extern bool cc_to_mncc_tx_confirmed; extern uint32_t cc_to_mncc_tx_got_callref; +extern struct gsm_mncc *on_call_release_mncc_sends_to_cc_data; + static inline void expect_iu_release() { iu_release_expected = true; |