sgsn: Add global require_update_location flag

This flag is used to determine, whether the Update Location procedure
shall be invoked. This is currently only set, when the 'remote'
authorization policy is set. When the flag is set, sgsn_auth_update
will not never be called directly by sgsn_auth_request, if an Attach
Request procedure is pending, even if the remote connection fails for
some reason.

Sponsored-by: On-Waves ehf
This commit is contained in:
Jacob Erlbeck 2014-12-19 18:08:48 +01:00 committed by Holger Hans Peter Freyther
parent a071c1ccc0
commit 771573c535
4 changed files with 11 additions and 4 deletions

View File

@ -32,6 +32,7 @@ struct sgsn_config {
int gsup_server_port;
int require_authentication;
int require_update_location;
};
struct sgsn_instance {

View File

@ -161,9 +161,9 @@ int sgsn_auth_request(struct sgsn_mm_ctx *mmctx)
return 0;
}
need_update_location =
mmctx->subscr == NULL ||
mmctx->pending_req == GSM48_MT_GMM_ATTACH_REQ;
need_update_location = sgsn->cfg.require_update_location &&
(mmctx->subscr == NULL ||
mmctx->pending_req == GSM48_MT_GMM_ATTACH_REQ);
/* This has the side effect of registering the subscr with the mmctx */
subscr = gprs_subscr_get_or_create_by_mmctx(mmctx);
@ -191,8 +191,11 @@ int sgsn_auth_request(struct sgsn_mm_ctx *mmctx)
} else if (need_update_location) {
LOGMMCTXP(LOGL_INFO, mmctx,
"Missing information, requesting subscriber data\n");
if (gprs_subscr_request_update_location(mmctx) >= 0)
rc = gprs_subscr_request_update_location(mmctx);
if (rc >= 0)
return 0;
return rc;
}
sgsn_auth_update(mmctx);

View File

@ -377,6 +377,7 @@ DEFUN(cfg_auth_policy, cfg_auth_policy_cmd,
OSMO_ASSERT(val >= SGSN_AUTH_POLICY_OPEN && val <= SGSN_AUTH_POLICY_REMOTE);
g_cfg->auth_policy = val;
g_cfg->require_authentication = (val == SGSN_AUTH_POLICY_REMOTE);
g_cfg->require_update_location = (val == SGSN_AUTH_POLICY_REMOTE);
return CMD_SUCCESS;
}

View File

@ -877,6 +877,7 @@ static void test_gmm_attach_subscr_fake_auth(void)
subscr = gprs_subscr_get_or_create("123456789012345");
subscr->authorized = 1;
sgsn->cfg.require_authentication = 1;
sgsn->cfg.require_update_location = 1;
subscr_put(subscr);
printf("Auth policy 'remote', auth faked: ");
@ -919,6 +920,7 @@ static void test_gmm_attach_subscr_real_auth(void)
subscr = gprs_subscr_get_or_create("123456789012345");
subscr->authorized = 1;
sgsn->cfg.require_authentication = 1;
sgsn->cfg.require_update_location = 1;
subscr_put(subscr);
printf("Auth policy 'remote', triplet based auth: ");