aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeels Hofmeyr <neels@hofmeyr.de>2017-12-18 02:06:44 +0100
committerNeels Hofmeyr <neels@hofmeyr.de>2017-12-18 05:18:11 +0100
commite3d72d782799700a0544b4fdd7b0bcb3d4a210cd (patch)
tree47fe09329f7800d48ca34ef3da2ec3efe5933e83
parent703638e79a7c78c5794acf6d1c15885e314354b2 (diff)
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
-rw-r--r--include/osmocom/msc/vlr.h2
-rw-r--r--src/libvlr/vlr.c17
-rw-r--r--src/libvlr/vlr_auth_fsm.c12
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;
}