aboutsummaryrefslogtreecommitdiffstats
path: root/openbsc/tests/sgsn
diff options
context:
space:
mode:
authorJacob Erlbeck <jerlbeck@sysmocom.de>2014-12-19 18:30:41 +0100
committerHolger Hans Peter Freyther <holger@moiji-mobile.com>2015-01-18 17:23:59 +0100
commit7660ffa29fb463fc24b2ac8d735b9b345017bba6 (patch)
treeba159d404dbc4770fff9b4c65935f576ed9550ad /openbsc/tests/sgsn
parent3d722450de1cf34931d95f7a748a9b6c48e933f0 (diff)
sgsn/test: Extend tests to simulate lost GSUP requests
This patch extends test_gmm_attach to optionally resend Attach Requests until the SGSN responds to it instead of calling OSMO_ASSERT at a few places. The test_gmm_attach_subscr_gsup_auth test optionally uses this feature. It is called once in either mode. Sponsored-by: On-Waves ehf
Diffstat (limited to 'openbsc/tests/sgsn')
-rw-r--r--openbsc/tests/sgsn/sgsn_test.c55
-rw-r--r--openbsc/tests/sgsn/sgsn_test.ok1
2 files changed, 44 insertions, 12 deletions
diff --git a/openbsc/tests/sgsn/sgsn_test.c b/openbsc/tests/sgsn/sgsn_test.c
index 560b1114c..d9cb84212 100644
--- a/openbsc/tests/sgsn/sgsn_test.c
+++ b/openbsc/tests/sgsn/sgsn_test.c
@@ -661,7 +661,7 @@ static void test_gmm_status_no_mmctx(void)
/*
* Test the GMM Attach procedure
*/
-static void test_gmm_attach(void)
+static void test_gmm_attach(int retry)
{
struct gprs_ra_id raid = { 0, };
struct sgsn_mm_ctx *ctx = NULL;
@@ -711,7 +711,7 @@ static void test_gmm_attach(void)
0x45, 0x67, 0x19, 0x03, 0xb9, 0x97, 0xcb
};
- printf("Testing GMM attach\n");
+ printf("Testing GMM attach%s\n", retry ? " with retry" : "");
/* reset the PRNG used by sgsn_alloc_ptmsi */
srand(1);
@@ -758,9 +758,17 @@ static void test_gmm_attach(void)
OSMO_ASSERT(ctx->mm_state == GMM_COMMON_PROC_INIT);
- if (ctx->auth_state == SGSN_AUTH_AUTHENTICATE) {
- /* we expect an auth & ciph request */
- OSMO_ASSERT(sgsn_tx_counter == 1);
+retry_attach_req:
+
+ if (retry && sgsn_tx_counter == 0) {
+ fprintf(stderr, "Retrying attach request\n");
+ /* re-inject the attach request */
+ send_0408_message(lle->llme, foreign_tlli,
+ attach_req, ARRAY_SIZE(attach_req));
+ }
+
+ if (ctx->auth_state == SGSN_AUTH_AUTHENTICATE && sgsn_tx_counter == 1) {
+ /* we got an auth & ciph request */
/* inject the auth & ciph response */
send_0408_message(ctx->llme, foreign_tlli,
@@ -771,6 +779,9 @@ static void test_gmm_attach(void)
OSMO_ASSERT(ctx == sgsn_mm_ctx_by_tlli(foreign_tlli, &raid));
}
+ if (retry && sgsn_tx_counter == 0)
+ goto retry_attach_req;
+
/* we expect an attach accept/reject */
OSMO_ASSERT(sgsn_tx_counter == 1);
@@ -803,7 +814,7 @@ static void test_gmm_attach_acl(void)
sgsn_inst.cfg.auth_policy = SGSN_AUTH_POLICY_CLOSED;
sgsn_acl_add("123456789012345", &sgsn->cfg);
printf("Auth policy 'closed': ");
- test_gmm_attach();
+ test_gmm_attach(0);
sgsn_acl_del("123456789012345", &sgsn->cfg);
sgsn->cfg.auth_policy = saved_auth_policy;
@@ -838,7 +849,7 @@ static void test_gmm_attach_subscr(void)
subscr_put(subscr);
printf("Auth policy 'remote': ");
- test_gmm_attach();
+ test_gmm_attach(0);
subscr = gprs_subscr_get_by_imsi("123456789012345");
OSMO_ASSERT(subscr != NULL);
@@ -875,7 +886,7 @@ static void test_gmm_attach_subscr_fake_auth(void)
subscr_put(subscr);
printf("Auth policy 'remote', auth faked: ");
- test_gmm_attach();
+ test_gmm_attach(0);
subscr = gprs_subscr_get_by_imsi("123456789012345");
OSMO_ASSERT(subscr != NULL);
@@ -918,7 +929,7 @@ static void test_gmm_attach_subscr_real_auth(void)
subscr_put(subscr);
printf("Auth policy 'remote', triplet based auth: ");
- test_gmm_attach();
+ test_gmm_attach(0);
subscr = gprs_subscr_get_by_imsi("123456789012345");
OSMO_ASSERT(subscr != NULL);
@@ -932,6 +943,9 @@ static void test_gmm_attach_subscr_real_auth(void)
#define TEST_GSUP_IMSI_LONG_IE 0x01, 0x08, \
0x21, 0x43, 0x65, 0x87, 0x09, 0x21, 0x43, 0xf5
+static int auth_info_skip = 0;
+static int upd_loc_skip = 0;
+
int my_subscr_request_auth_info_gsup_auth(struct sgsn_mm_ctx *mmctx)
{
static const uint8_t send_auth_info_res[] = {
@@ -949,6 +963,11 @@ int my_subscr_request_auth_info_gsup_auth(struct sgsn_mm_ctx *mmctx)
OSMO_ASSERT(mmctx->subscr);
+ if (auth_info_skip > 0) {
+ auth_info_skip -= 1;
+ return -EAGAIN;
+ }
+
/* Fake an SendAuthInfoRes */
rx_gsup_message(send_auth_info_res, sizeof(send_auth_info_res));
@@ -968,12 +987,17 @@ int my_subscr_request_update_gsup_auth(struct sgsn_mm_ctx *mmctx) {
OSMO_ASSERT(mmctx->subscr);
+ if (upd_loc_skip > 0) {
+ upd_loc_skip -= 1;
+ return -EAGAIN;
+ }
+
/* Fake an UpdateLocRes */
return rx_gsup_message(update_location_res, sizeof(update_location_res));
};
-static void test_gmm_attach_subscr_gsup_auth(void)
+static void test_gmm_attach_subscr_gsup_auth(int retry)
{
const enum sgsn_auth_policy saved_auth_policy = sgsn->cfg.auth_policy;
struct gsm_subscriber *subscr;
@@ -981,6 +1005,10 @@ static void test_gmm_attach_subscr_gsup_auth(void)
sgsn_inst.cfg.auth_policy = SGSN_AUTH_POLICY_REMOTE;
subscr_request_update_location_cb = my_subscr_request_update_gsup_auth;
subscr_request_auth_info_cb = my_subscr_request_auth_info_gsup_auth;
+ if (retry) {
+ upd_loc_skip = 3;
+ auth_info_skip = 3;
+ }
subscr = gprs_subscr_get_or_create("123456789012345");
subscr->authorized = 1;
@@ -989,7 +1017,7 @@ static void test_gmm_attach_subscr_gsup_auth(void)
subscr_put(subscr);
printf("Auth policy 'remote', GSUP based auth: ");
- test_gmm_attach();
+ test_gmm_attach(retry);
subscr = gprs_subscr_get_by_imsi("123456789012345");
OSMO_ASSERT(subscr != NULL);
@@ -998,6 +1026,8 @@ static void test_gmm_attach_subscr_gsup_auth(void)
sgsn->cfg.auth_policy = saved_auth_policy;
subscr_request_update_location_cb = __real_gprs_subscr_request_update_location;
subscr_request_auth_info_cb = __real_gprs_subscr_request_auth_info;
+ upd_loc_skip = 0;
+ auth_info_skip = 0;
}
/*
@@ -1525,7 +1555,8 @@ int main(int argc, char **argv)
test_gmm_attach_subscr();
test_gmm_attach_subscr_fake_auth();
test_gmm_attach_subscr_real_auth();
- test_gmm_attach_subscr_gsup_auth();
+ test_gmm_attach_subscr_gsup_auth(0);
+ test_gmm_attach_subscr_gsup_auth(1);
test_gmm_reject();
test_gmm_cancel();
test_gmm_ptmsi_allocation();
diff --git a/openbsc/tests/sgsn/sgsn_test.ok b/openbsc/tests/sgsn/sgsn_test.ok
index a3c03428a..c9c016597 100644
--- a/openbsc/tests/sgsn/sgsn_test.ok
+++ b/openbsc/tests/sgsn/sgsn_test.ok
@@ -12,6 +12,7 @@ Auth policy 'remote': Testing GMM attach
Auth policy 'remote', auth faked: Testing GMM attach
Auth policy 'remote', triplet based auth: Testing GMM attach
Auth policy 'remote', GSUP based auth: Testing GMM attach
+Auth policy 'remote', GSUP based auth: Testing GMM attach with retry
Testing GMM reject
- Attach Request (invalid MI length)
- Attach Request (invalid MI type)