aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeels Hofmeyr <neels@hofmeyr.de>2018-03-13 17:52:07 +0100
committerNeels Hofmeyr <neels@hofmeyr.de>2018-03-13 18:10:32 +0100
commit212e54cec1b42839a0f055185b6cc99977041108 (patch)
tree910538b4e2f335acd80f4131142d9bd91c486df2
parent5222d8f3bfe67d327c0fb577aff9b7b2cc21364c (diff)
msc_vlr_test_call: reproduce OS#3062neels/os3062
-rw-r--r--tests/msc_vlr/msc_vlr_test_call.c80
-rw-r--r--tests/msc_vlr/msc_vlr_tests.c7
-rw-r--r--tests/msc_vlr/msc_vlr_tests.h2
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;