Commit c140a19c authored by Raphael Defosseux's avatar Raphael Defosseux

Merge branch 'fix_tmsi_handling' into 'develop'

Fix tmsi handling

See merge request oai/cn5g/oai-cn5g-amf!184
parents c904b0f4 0ce0fbc7
...@@ -204,7 +204,6 @@ long amf_app::generate_amf_ue_ngap_id() { ...@@ -204,7 +204,6 @@ long amf_app::generate_amf_ue_ngap_id() {
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
bool amf_app::is_ran_amf_id_2_ue_context(const string& ue_context_key) const { bool amf_app::is_ran_amf_id_2_ue_context(const string& ue_context_key) const {
std::shared_lock lock(m_ue_ctx_key); std::shared_lock lock(m_ue_ctx_key);
// return bool{ue_ctx_key.count(ue_context_key) > 0};
if (ue_ctx_key.count(ue_context_key) > 0) { if (ue_ctx_key.count(ue_context_key) > 0) {
if (ue_ctx_key.at(ue_context_key) != nullptr) { if (ue_ctx_key.at(ue_context_key) != nullptr) {
return true; return true;
...@@ -407,14 +406,16 @@ void amf_app::handle_itti_message( ...@@ -407,14 +406,16 @@ void amf_app::handle_itti_message(
uc->isUeContextRequest = false; uc->isUeContextRequest = false;
else else
uc->isUeContextRequest = true; uc->isUeContextRequest = true;
uc->ran_ue_ngap_id = itti_msg.ran_ue_ngap_id; uc->ran_ue_ngap_id = itti_msg.ran_ue_ngap_id;
uc->amf_ue_ngap_id = amf_ue_ngap_id; uc->amf_ue_ngap_id = amf_ue_ngap_id;
std::string guti = {}; std::string guti = {};
bool is_guti_valid = false; bool is_guti_valid = false;
if (itti_msg.is_5g_s_tmsi_present) { if (itti_msg.is_5g_s_tmsi_present) {
guti = itti_msg.tai.mcc + itti_msg.tai.mnc + amf_cfg.guami.regionID + guti = conv::tmsi_to_guti(
itti_msg._5g_s_tmsi; itti_msg.tai.mcc, itti_msg.tai.mnc, amf_cfg.guami.regionID,
itti_msg._5g_s_tmsi);
is_guti_valid = true; is_guti_valid = true;
Logger::amf_app().debug("Receiving GUTI %s", guti.c_str()); Logger::amf_app().debug("Receiving GUTI %s", guti.c_str());
} }
...@@ -822,6 +823,7 @@ uint32_t amf_app::get_number_registered_ues() const { ...@@ -822,6 +823,7 @@ uint32_t amf_app::get_number_registered_ues() const {
std::shared_lock lock(m_amf_ue_ngap_id2ue_ctx); std::shared_lock lock(m_amf_ue_ngap_id2ue_ctx);
return amf_ue_ngap_id2ue_ctx.size(); return amf_ue_ngap_id2ue_ctx.size();
} }
//--------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------
void amf_app::add_n1n2_message_subscription( void amf_app::add_n1n2_message_subscription(
const std::string& ue_ctx_id, const n1n2sub_id_t& sub_id, const std::string& ue_ctx_id, const n1n2sub_id_t& sub_id,
......
This diff is collapsed.
...@@ -221,22 +221,22 @@ class amf_n1 { ...@@ -221,22 +221,22 @@ class amf_n1 {
bool remove_supi_2_ran_id(const std::string& supi); bool remove_supi_2_ran_id(const std::string& supi);
/* /*
* Get UE NAS context associated with an IMSI * Get UE NAS context associated with an SUPI
* @param [const std::string&] imsi: UE IMSI * @param [const std::string&] imsi: UE SUPI
* @param [const std::shared_ptr<nas_context>&] nc: pointer to UE NAS context * @param [const std::shared_ptr<nas_context>&] nc: pointer to UE NAS context
* @return true if the NAS context exists and is not null, otherwise return * @return true if the NAS context exists and is not null, otherwise return
* false * false
*/ */
bool imsi_2_nas_context( bool supi_2_nas_context(
const std::string& imsi, std::shared_ptr<nas_context>&) const; const std::string& imsi, std::shared_ptr<nas_context>&) const;
/* /*
* Store an UE NAS context associated with an IMSI * Store an UE NAS context associated with an SUPI
* @param [const std::string&] imsi: UE IMSI * @param [const std::string&] imsi: UE SUPI
* @param [const std::shared_ptr<nas_context>&] nc: pointer to UE NAS context * @param [const std::shared_ptr<nas_context>&] nc: pointer to UE NAS context
* @return void * @return void
*/ */
void set_imsi_2_nas_context( void set_supi_2_nas_context(
const std::string& imsi, const std::shared_ptr<nas_context>& nc); const std::string& imsi, const std::shared_ptr<nas_context>& nc);
/* /*
...@@ -244,7 +244,7 @@ class amf_n1 { ...@@ -244,7 +244,7 @@ class amf_n1 {
* @param [const std::string&] imsi: UE IMSI * @param [const std::string&] imsi: UE IMSI
* @return true if successful, otherwise return false * @return true if successful, otherwise return false
*/ */
bool remove_imsi_2_nas_context(const std::string& imsi); bool remove_supi_2_nas_context(const std::string& imsi);
/* /*
* Perform Registration procedure * Perform Registration procedure
...@@ -991,7 +991,7 @@ class amf_n1 { ...@@ -991,7 +991,7 @@ class amf_n1 {
amfueid2nas_context; // amf ue ngap id amfueid2nas_context; // amf ue ngap id
mutable std::shared_mutex m_amfueid2nas_context; mutable std::shared_mutex m_amfueid2nas_context;
std::map<std::string, std::shared_ptr<nas_context>> imsi2nas_context; std::map<std::string, std::shared_ptr<nas_context>> supi2nas_context;
std::map<std::string, long> supi2amfId; std::map<std::string, long> supi2amfId;
std::map<std::string, uint32_t> supi2ranId; std::map<std::string, uint32_t> supi2ranId;
mutable std::shared_mutex m_nas_context; mutable std::shared_mutex m_nas_context;
......
...@@ -888,7 +888,7 @@ void amf_n2::handle_itti_message(itti_initial_context_setup_request& itti_msg) { ...@@ -888,7 +888,7 @@ void amf_n2::handle_itti_message(itti_initial_context_setup_request& itti_msg) {
itti_msg.amf_ue_ngap_id); itti_msg.amf_ue_ngap_id);
// TODO: // TODO:
} }
string supi = "imsi-" + nc->imsi; string supi = conv::imsi_to_supi(nc->imsi);
Logger::amf_n2().debug("SUPI (%s)", supi.c_str()); Logger::amf_n2().debug("SUPI (%s)", supi.c_str());
// Get S_NSSAI from PDU Session Context // Get S_NSSAI from PDU Session Context
...@@ -974,7 +974,7 @@ void amf_n2::handle_itti_message( ...@@ -974,7 +974,7 @@ void amf_n2::handle_itti_message(
itti_msg.amf_ue_ngap_id); itti_msg.amf_ue_ngap_id);
// TODO: // TODO:
} }
string supi = "imsi-" + nc->imsi; string supi = conv::imsi_to_supi(nc->imsi);
Logger::amf_n2().debug("SUPI (%s)", supi.c_str()); Logger::amf_n2().debug("SUPI (%s)", supi.c_str());
// Get SNSSAI info from PDU Session Context // Get SNSSAI info from PDU Session Context
...@@ -1196,7 +1196,7 @@ void amf_n2::handle_itti_message(itti_ue_context_release_command& itti_msg) { ...@@ -1196,7 +1196,7 @@ void amf_n2::handle_itti_message(itti_ue_context_release_command& itti_msg) {
itti_msg.amf_ue_ngap_id); itti_msg.amf_ue_ngap_id);
return; return;
} }
string supi = "imsi-" + nc->imsi; string supi = conv::imsi_to_supi(nc->imsi);
Logger::amf_n2().debug( Logger::amf_n2().debug(
"Send request to SBI to trigger UE Communication Failure Report (SUPI " "Send request to SBI to trigger UE Communication Failure Report (SUPI "
...@@ -1304,7 +1304,7 @@ void amf_n2::handle_itti_message(itti_ue_context_release_complete& itti_msg) { ...@@ -1304,7 +1304,7 @@ void amf_n2::handle_itti_message(itti_ue_context_release_complete& itti_msg) {
// TODO: may consider releasing all exisiting PDU sessions // TODO: may consider releasing all exisiting PDU sessions
/* /*
if (pdu_sessions_to_be_released.size() == 0) { if (pdu_sessions_to_be_released.size() == 0) {
string supi = "imsi-" + nc->imsi; string supi = conv::imsi_to_supi(nc->imsi);
std::vector<std::shared_ptr<pdu_session_context>> sessions_ctx; std::vector<std::shared_ptr<pdu_session_context>> sessions_ctx;
if (!amf_app_inst->get_pdu_sessions_context(supi, sessions_ctx)) { if (!amf_app_inst->get_pdu_sessions_context(supi, sessions_ctx)) {
Logger::amf_n2().debug("No PDU Session Context found"); Logger::amf_n2().debug("No PDU Session Context found");
...@@ -1556,7 +1556,7 @@ bool amf_n2::handle_itti_message(itti_handover_required& itti_msg) { ...@@ -1556,7 +1556,7 @@ bool amf_n2::handle_itti_message(itti_handover_required& itti_msg) {
bstring knh_bs = blk2bstr(knh, 32); bstring knh_bs = blk2bstr(knh, 32);
handover_request->setSecurityContext(unc->ncc /*NCC count*/, knh_bs); handover_request->setSecurityContext(unc->ncc /*NCC count*/, knh_bs);
string supi = "imsi-" + nc->imsi; string supi = conv::imsi_to_supi(nc->imsi);
Logger::amf_n2().debug( Logger::amf_n2().debug(
"Received Handover Required for UE (SUPI %s)", supi.c_str()); "Received Handover Required for UE (SUPI %s)", supi.c_str());
...@@ -1738,7 +1738,7 @@ void amf_n2::handle_itti_message(itti_handover_request_Ack& itti_msg) { ...@@ -1738,7 +1738,7 @@ void amf_n2::handle_itti_message(itti_handover_request_Ack& itti_msg) {
return; return;
} }
string supi = "imsi-" + nc->imsi; string supi = conv::imsi_to_supi(nc->imsi);
// Send PDUSessionUpdateSMContextRequest to SMF for all associated PDU // Send PDUSessionUpdateSMContextRequest to SMF for all associated PDU
// sessions // sessions
...@@ -1890,7 +1890,7 @@ void amf_n2::handle_itti_message(itti_handover_notify& itti_msg) { ...@@ -1890,7 +1890,7 @@ void amf_n2::handle_itti_message(itti_handover_notify& itti_msg) {
return; return;
} }
string supi = "imsi-" + nc->imsi; string supi = conv::imsi_to_supi(nc->imsi);
std::vector<std::shared_ptr<pdu_session_context>> sessions_ctx; std::vector<std::shared_ptr<pdu_session_context>> sessions_ctx;
...@@ -2184,7 +2184,7 @@ void amf_n2::remove_ue_context_with_ran_ue_ngap_id( ...@@ -2184,7 +2184,7 @@ void amf_n2::remove_ue_context_with_ran_ue_ngap_id(
std::shared_ptr<nas_context> nc = {}; std::shared_ptr<nas_context> nc = {};
if (amf_n1_inst->amf_ue_id_2_nas_context(unc->amf_ue_ngap_id, nc)) { if (amf_n1_inst->amf_ue_id_2_nas_context(unc->amf_ue_ngap_id, nc)) {
// Remove all NAS context // Remove all NAS context
string supi = "imsi-" + nc->imsi; string supi = conv::imsi_to_supi(nc->imsi);
if (nc->is_stacs_available) { if (nc->is_stacs_available) {
stacs.update_5gmm_state(nc->imsi, "5GMM-DEREGISTERED"); stacs.update_5gmm_state(nc->imsi, "5GMM-DEREGISTERED");
} }
...@@ -2195,7 +2195,7 @@ void amf_n2::remove_ue_context_with_ran_ue_ngap_id( ...@@ -2195,7 +2195,7 @@ void amf_n2::remove_ue_context_with_ran_ue_ngap_id(
amf_n1_inst->event_sub.ue_loss_of_connectivity( amf_n1_inst->event_sub.ue_loss_of_connectivity(
supi, DEREGISTERED, 1, ran_ue_ngap_id, unc->amf_ue_ngap_id); supi, DEREGISTERED, 1, ran_ue_ngap_id, unc->amf_ue_ngap_id);
amf_n1_inst->remove_imsi_2_nas_context(supi); amf_n1_inst->remove_supi_2_nas_context(supi);
// TODO: remove_guti_2_nas_context(guti); // TODO: remove_guti_2_nas_context(guti);
amf_n1_inst->remove_amf_ue_ngap_id_2_nas_context(unc->amf_ue_ngap_id); amf_n1_inst->remove_amf_ue_ngap_id_2_nas_context(unc->amf_ue_ngap_id);
// Update UE status // Update UE status
...@@ -2271,7 +2271,7 @@ void amf_n2::remove_ue_context_with_amf_ue_ngap_id( ...@@ -2271,7 +2271,7 @@ void amf_n2::remove_ue_context_with_amf_ue_ngap_id(
std::shared_ptr<nas_context> nc = {}; std::shared_ptr<nas_context> nc = {};
if (amf_n1_inst->amf_ue_id_2_nas_context(amf_ue_ngap_id, nc)) { if (amf_n1_inst->amf_ue_id_2_nas_context(amf_ue_ngap_id, nc)) {
// Remove all NAS context // Remove all NAS context
string supi = "imsi-" + nc->imsi; string supi = conv::imsi_to_supi(nc->imsi);
// Update UE status // Update UE status
if (nc->is_stacs_available) { if (nc->is_stacs_available) {
stacs.update_5gmm_state(nc->imsi, "5GMM-DEREGISTERED"); stacs.update_5gmm_state(nc->imsi, "5GMM-DEREGISTERED");
...@@ -2283,7 +2283,7 @@ void amf_n2::remove_ue_context_with_amf_ue_ngap_id( ...@@ -2283,7 +2283,7 @@ void amf_n2::remove_ue_context_with_amf_ue_ngap_id(
amf_n1_inst->event_sub.ue_loss_of_connectivity( amf_n1_inst->event_sub.ue_loss_of_connectivity(
supi, DEREGISTERED, 1, nc->ran_ue_ngap_id, amf_ue_ngap_id); supi, DEREGISTERED, 1, nc->ran_ue_ngap_id, amf_ue_ngap_id);
amf_n1_inst->remove_imsi_2_nas_context(supi); amf_n1_inst->remove_supi_2_nas_context(supi);
// TODO: remove_guti_2_nas_context(guti); // TODO: remove_guti_2_nas_context(guti);
amf_n1_inst->remove_amf_ue_ngap_id_2_nas_context(amf_ue_ngap_id); amf_n1_inst->remove_amf_ue_ngap_id_2_nas_context(amf_ue_ngap_id);
// Remove NGAP context related to RAN UE NGAP ID // Remove NGAP context related to RAN UE NGAP ID
......
...@@ -285,7 +285,7 @@ void amf_sbi::handle_itti_message(itti_nsmf_pdusession_create_sm_context& smf) { ...@@ -285,7 +285,7 @@ void amf_sbi::handle_itti_message(itti_nsmf_pdusession_create_sm_context& smf) {
return; return;
} }
std::string supi = "imsi-" + nc->imsi; string supi = conv::imsi_to_supi(nc->imsi);
string ue_context_key = string ue_context_key =
conv::get_ue_context_key(nc->ran_ue_ngap_id, nc->amf_ue_ngap_id); conv::get_ue_context_key(nc->ran_ue_ngap_id, nc->amf_ue_ngap_id);
std::shared_ptr<ue_context> uc = {}; std::shared_ptr<ue_context> uc = {};
......
...@@ -33,6 +33,9 @@ ...@@ -33,6 +33,9 @@
#include "amf.hpp" #include "amf.hpp"
#include "logger.hpp" #include "logger.hpp"
constexpr uint8_t kUint32Length =
8; // 4 bytes -8 characters representation in hex
static const char hex_to_ascii_table[16] = { static const char hex_to_ascii_table[16] = {
'0', '1', '2', '3', '4', '5', '6', '7', '0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', 'a', 'b', 'c', 'd', 'e', 'f', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f',
...@@ -110,8 +113,8 @@ std::string conv::mncToString( ...@@ -110,8 +113,8 @@ std::string conv::mncToString(
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
std::string conv::tmsi_to_string(const uint32_t tmsi) { std::string conv::tmsi_to_string(const uint32_t tmsi) {
std::string s = {}; std::string s = {};
std::string tmsi_str = std::to_string(tmsi); std::string tmsi_str = uint32_to_hex_string(tmsi);
uint8_t length = 4 - tmsi_str.size(); uint8_t length = kUint32Length - tmsi_str.size();
for (uint8_t i = 0; i < length; i++) { for (uint8_t i = 0; i < length; i++) {
s.append("0"); s.append("0");
} }
...@@ -491,3 +494,35 @@ std::string conv::get_serving_network_name( ...@@ -491,3 +494,35 @@ std::string conv::get_serving_network_name(
snn = "5G:mnc" + mnc + ".mcc" + mcc + ".3gppnetwork.org"; snn = "5G:mnc" + mnc + ".mcc" + mcc + ".3gppnetwork.org";
return snn; return snn;
} }
//------------------------------------------------------------------------------
std::string conv::uint32_to_hex_string(uint32_t value) {
char hex_str[kUint32Length + 1];
sprintf(hex_str, "%X", value);
return std::string(hex_str);
}
//------------------------------------------------------------------------------
std::string conv::tmsi_to_guti(
const std::string& mcc, const std::string& mnc,
const std::string& region_id, const std::string& _5g_s_tmsi) {
return {mcc + mnc + region_id + _5g_s_tmsi};
}
//------------------------------------------------------------------------------
std::string conv::tmsi_to_guti(
const std::string& mcc, const std::string& mnc,
const std::string& region_id, const std::string& amf_set_id,
const std::string& amf_pointer, const std::string& tmsi) {
return {mcc + mnc + region_id + amf_set_id + amf_pointer + tmsi};
}
//------------------------------------------------------------------------------
std::string conv::imsi_to_supi(const std::string& imsi) {
return {"imsi-" + imsi};
}
//------------------------------------------------------------------------------
std::string conv::get_imsi(
const std::string& mcc, const std::string& mnc, const std::string& msin) {
return {mcc + mnc + msin};
}
...@@ -99,5 +99,16 @@ class conv { ...@@ -99,5 +99,16 @@ class conv {
const uint32_t ran_ue_ngap_id, long amf_ue_ngap_id); const uint32_t ran_ue_ngap_id, long amf_ue_ngap_id);
static std::string get_serving_network_name( static std::string get_serving_network_name(
const std::string& mnc, const std::string& mcc); const std::string& mnc, const std::string& mcc);
static std::string uint32_to_hex_string(uint32_t value);
static std::string tmsi_to_guti(
const std::string& mcc, const std::string& mnc,
const std::string& region_id, const std::string& _5g_s_tmsi);
static std::string tmsi_to_guti(
const std::string& mcc, const std::string& mnc,
const std::string& region_id, const std::string& amf_set_id,
const std::string& amf_pointer, const std::string& tmsi);
static std::string imsi_to_supi(const std::string& imsi);
static std::string get_imsi(
const std::string& mcc, const std::string& mnc, const std::string& msin);
}; };
#endif /* FILE_CONVERSIONS_HPP_SEEN */ #endif /* FILE_CONVERSIONS_HPP_SEEN */
...@@ -433,7 +433,7 @@ int ngap_amf_handle_pdu_session_resource_setup_response( ...@@ -433,7 +433,7 @@ int ngap_amf_handle_pdu_session_resource_setup_response(
"No UE NAS context with amf_ue_ngap_id (0x%x)", amf_ue_ngap_id); "No UE NAS context with amf_ue_ngap_id (0x%x)", amf_ue_ngap_id);
return RETURNerror; return RETURNerror;
} }
itti_msg->supi = "imsi-" + nct->imsi; itti_msg->supi = conv::imsi_to_supi(nct->imsi);
itti_msg->pdu_session_id = list[0].pduSessionId; itti_msg->pdu_session_id = list[0].pduSessionId;
itti_msg->n2sm = blk2bstr( itti_msg->n2sm = blk2bstr(
list[0].pduSessionResourceSetupResponseTransfer.buf, list[0].pduSessionResourceSetupResponseTransfer.buf,
...@@ -503,7 +503,7 @@ int ngap_amf_handle_pdu_session_resource_setup_response( ...@@ -503,7 +503,7 @@ int ngap_amf_handle_pdu_session_resource_setup_response(
return RETURNerror; return RETURNerror;
} }
string supi = "imsi-" + nct->imsi; string supi = conv::imsi_to_supi(nct->imsi);
std::shared_ptr<pdu_session_context> psc = {}; std::shared_ptr<pdu_session_context> psc = {};
if (amf_app_inst->find_pdu_session_context( if (amf_app_inst->find_pdu_session_context(
supi, list_fail[0].pduSessionId, psc)) { supi, list_fail[0].pduSessionId, psc)) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment