aboutsummaryrefslogtreecommitdiffstats
path: root/tests/msc_vlr/msc_vlr_test_ms_timeout.c
diff options
context:
space:
mode:
authorNeels Hofmeyr <neels@hofmeyr.de>2017-12-15 03:02:27 +0100
committerNeels Hofmeyr <neels@hofmeyr.de>2017-12-20 23:07:10 +0100
commit2ff5bcdc387a7eb5135e5a54d55027502952c86b (patch)
tree602296791799e12d7f1aab0f635694d211c69ac8 /tests/msc_vlr/msc_vlr_test_ms_timeout.c
parentc1d69256f61e6bc7bdcbbd1b4df6a779c7883891 (diff)
fix paging: add timeout to discard unsuccessful paging
Currently, if there is no reply from the BSS / RNC, a subscriber will remain as "already paged" forever, and is never going to be paged again. Even on IMSI Detach, the pending request will keep a ref count on the vlr_subscr. Add a paging timeout, as gsm_network->paging_timeout and in the VTY on the 'msc' node as 'paging timeout (default|<1-65535>'. (There is a 'network' / 'T3113' in OsmoBSC, but to not confuse the two, give this a different name.) Add test_ms_timeout_paging() test to verify the timeout works. I hit this while testing Paging across multiple hNodeB, when a UE lost connection to the hNodeB. I noticed that no matter how long I wait, no Paging is sent out anymore, and found this embarrassing issue. Good grief... The choice of 10 seconds is taken from https://osmocom.org/issues/2756 Change-Id: I2db6f1e2ad341cf9c2cc7a21ec2fca0bae5b2db5
Diffstat (limited to 'tests/msc_vlr/msc_vlr_test_ms_timeout.c')
-rw-r--r--tests/msc_vlr/msc_vlr_test_ms_timeout.c93
1 files changed, 93 insertions, 0 deletions
diff --git a/tests/msc_vlr/msc_vlr_test_ms_timeout.c b/tests/msc_vlr/msc_vlr_test_ms_timeout.c
index d8a3a314e..4e0e27d1d 100644
--- a/tests/msc_vlr/msc_vlr_test_ms_timeout.c
+++ b/tests/msc_vlr/msc_vlr_test_ms_timeout.c
@@ -182,8 +182,101 @@ void test_ms_timeout_cm_auth_resp()
comment_end();
}
+void test_ms_timeout_paging()
+{
+ struct vlr_subscr *vsub;
+ const char *imsi = "901700000004620";
+
+ rx_from_ran = RAN_GERAN_A;
+
+ comment_start();
+
+ fake_time_start();
+
+ btw("Location Update request causes a GSUP LU request to HLR");
+ lu_result_sent = RES_NONE;
+ gsup_expect_tx("04010809710000004026f0");
+ ms_sends_msg("050802008168000130089910070000006402");
+ OSMO_ASSERT(gsup_tx_confirmed);
+ VERBOSE_ASSERT(lu_result_sent, == RES_NONE, "%d");
+
+ btw("HLR sends _INSERT_DATA_REQUEST, VLR responds with _INSERT_DATA_RESULT");
+ gsup_rx("10010809710000004026f00804036470f1",
+ "12010809710000004026f0");
+ VERBOSE_ASSERT(lu_result_sent, == RES_NONE, "%d");
+
+ btw("HLR also sends GSUP _UPDATE_LOCATION_RESULT");
+ expect_bssap_clear();
+ gsup_rx("06010809710000004026f0", NULL);
+
+ btw("LU was successful, and the conn has already been closed");
+ VERBOSE_ASSERT(lu_result_sent, == RES_ACCEPT, "%d");
+ VERBOSE_ASSERT(bssap_clear_sent, == true, "%d");
+ EXPECT_CONN_COUNT(0);
+
+ BTW("an SMS is sent, MS is paged");
+ paging_expect_imsi(imsi);
+ paging_sent = false;
+ vsub = vlr_subscr_find_by_imsi(net->vlr, imsi);
+ OSMO_ASSERT(vsub);
+ VERBOSE_ASSERT(llist_count(&vsub->cs.requests), == 0, "%d");
+
+ send_sms(vsub, vsub,
+ "Privacy in residential applications is a desirable"
+ " marketing option.");
+
+ VERBOSE_ASSERT(llist_count(&vsub->cs.requests), == 1, "%d");
+ vlr_subscr_put(vsub);
+ vsub = NULL;
+ VERBOSE_ASSERT(paging_sent, == true, "%d");
+ VERBOSE_ASSERT(paging_stopped, == false, "%d");
+
+ btw("time passes and no paging result is received");
+
+ fake_time_passes(MSC_PAGING_RESPONSE_TIMER_DEFAULT - 1, 0);
+
+ btw("the paging timeout has not yet expired");
+ VERBOSE_ASSERT(paging_stopped, == false, "%d");
+ vsub = vlr_subscr_find_by_imsi(net->vlr, imsi);
+ OSMO_ASSERT(vsub);
+ VERBOSE_ASSERT(vsub->cs.is_paging, == true, "%d");
+ btw("another request is added to the list but does not cause another paging");
+ paging_sent = false;
+ paging_expect_imsi(NULL);
+ send_sms(vsub, vsub,
+ "One paging ought to be enough for anyone.");
+ VERBOSE_ASSERT(llist_count(&vsub->cs.requests), == 2, "%d");
+ vlr_subscr_put(vsub);
+ vsub = NULL;
+ VERBOSE_ASSERT(paging_sent, == false, "%d");
+
+ btw("the paging timeout expires, the paging as well as the requests are canceled");
+ fake_time_passes(2, 0);
+ VERBOSE_ASSERT(paging_stopped, == true, "%d");
+
+ vsub = vlr_subscr_find_by_imsi(net->vlr, imsi);
+ OSMO_ASSERT(vsub);
+ VERBOSE_ASSERT(vsub->cs.is_paging, == false, "%d");
+ VERBOSE_ASSERT(llist_count(&vsub->cs.requests), == 0, "%d");
+ vlr_subscr_put(vsub);
+ vsub = NULL;
+
+ BTW("subscriber detaches");
+ expect_bssap_clear();
+ ms_sends_msg("050130089910070000006402");
+ VERBOSE_ASSERT(bssap_clear_sent, == true, "%d");
+
+ vsub = vlr_subscr_find_by_imsi(net->vlr, imsi);
+ OSMO_ASSERT(!vsub);
+
+ EXPECT_CONN_COUNT(0);
+ clear_vlr();
+ comment_end();
+}
+
msc_vlr_test_func_t msc_vlr_tests[] = {
test_ms_timeout_lu_auth_resp,
test_ms_timeout_cm_auth_resp,
+ test_ms_timeout_paging,
NULL
};