From e3d72d782799700a0544b4fdd7b0bcb3d4a210cd Mon Sep 17 00:00:00 2001 From: Neels Hofmeyr Date: Mon, 18 Dec 2017 02:06:44 +0100 Subject: cosmetic prep: publish vlr_use_umts_aka() decision During Set Ciphering Mode on GERAN, it is required to know whether UMTS AKA is used to decide which Kc to pick. Change static function is_umts_auth() into public vlr_use_umts_aka(), so future patches can re-use it. Prepares: If04e405426c55a81341747a9b450a69188525d5c Change-Id: I85d784c62ecbabdb6186a3dae4dcd554e7921041 --- include/osmocom/msc/vlr.h | 2 ++ src/libvlr/vlr.c | 17 +++++++++++++++++ src/libvlr/vlr_auth_fsm.c | 12 +----------- 3 files changed, 20 insertions(+), 11 deletions(-) diff --git a/include/osmocom/msc/vlr.h b/include/osmocom/msc/vlr.h index 640d35b46..df7d3548b 100644 --- a/include/osmocom/msc/vlr.h +++ b/include/osmocom/msc/vlr.h @@ -435,5 +435,7 @@ int vlr_set_ciph_mode(struct vlr_instance *vlr, enum vlr_ciph ciph_mode, bool retrieve_imeisv); +bool vlr_use_umts_aka(struct osmo_auth_vector *vec, bool is_r99); + void log_set_filter_vlr_subscr(struct log_target *target, struct vlr_subscr *vlr_subscr); diff --git a/src/libvlr/vlr.c b/src/libvlr/vlr.c index 16f365eba..55b8de006 100644 --- a/src/libvlr/vlr.c +++ b/src/libvlr/vlr.c @@ -1122,6 +1122,23 @@ int vlr_set_ciph_mode(struct vlr_instance *vlr, } } +/* Decide whether UMTS AKA should be used. + * UTRAN networks are by definition R99 capable, and the auth vector is required to contain UMTS AKA + * tokens. This is expected to be verified by the caller. On GERAN, UMTS AKA must be used iff MS and + * GERAN are R99 capable and UMTS AKA tokens are available. + * \param[in] vec Auth tokens (received from the HLR). + * \param[in] is_r99 True when BTS and GERAN are R99 capable. + * \returns true to use UMTS AKA, false to use pre-R99 GSM AKA. + */ +bool vlr_use_umts_aka(struct osmo_auth_vector *vec, bool is_r99) +{ + if (!is_r99) + return false; + if (!(vec->auth_types & OSMO_AUTH_TYPE_UMTS)) + return false; + return true; +} + void log_set_filter_vlr_subscr(struct log_target *target, struct vlr_subscr *vlr_subscr) { diff --git a/src/libvlr/vlr_auth_fsm.c b/src/libvlr/vlr_auth_fsm.c index 1376c829e..d14ae8efb 100644 --- a/src/libvlr/vlr_auth_fsm.c +++ b/src/libvlr/vlr_auth_fsm.c @@ -211,16 +211,6 @@ static void auth_fsm_onenter_failed(struct osmo_fsm_inst *fi, uint32_t prev_stat vlr_subscr_tx_auth_fail_rep(vsub); } -static bool is_umts_auth(struct auth_fsm_priv *afp, - uint32_t auth_types) -{ - if (!afp->is_r99) - return false; - if (!(auth_types & OSMO_AUTH_TYPE_UMTS)) - return false; - return true; -} - /* Terminate the Auth FSM Instance and notify parent */ static void auth_fsm_term(struct osmo_fsm_inst *fi, enum vlr_auth_fsm_result res) { @@ -268,7 +258,7 @@ static int _vlr_subscr_authenticate(struct osmo_fsm_inst *fi) afp->auth_requested = true; vsub->last_tuple = at; vsub->vlr->ops.tx_auth_req(vsub->msc_conn_ref, at, - is_umts_auth(afp, at->vec.auth_types)); + vlr_use_umts_aka(&at->vec, afp->is_r99)); return 0; } -- cgit v1.2.3