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() {
//------------------------------------------------------------------------------
bool amf_app::is_ran_amf_id_2_ue_context(const string& ue_context_key) const {
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.at(ue_context_key) != nullptr) {
return true;
......@@ -407,14 +406,16 @@ void amf_app::handle_itti_message(
uc->isUeContextRequest = false;
else
uc->isUeContextRequest = true;
uc->ran_ue_ngap_id = itti_msg.ran_ue_ngap_id;
uc->amf_ue_ngap_id = amf_ue_ngap_id;
std::string guti = {};
bool is_guti_valid = false;
if (itti_msg.is_5g_s_tmsi_present) {
guti = itti_msg.tai.mcc + itti_msg.tai.mnc + amf_cfg.guami.regionID +
itti_msg._5g_s_tmsi;
guti = conv::tmsi_to_guti(
itti_msg.tai.mcc, itti_msg.tai.mnc, amf_cfg.guami.regionID,
itti_msg._5g_s_tmsi);
is_guti_valid = true;
Logger::amf_app().debug("Receiving GUTI %s", guti.c_str());
}
......@@ -822,6 +823,7 @@ uint32_t amf_app::get_number_registered_ues() const {
std::shared_lock lock(m_amf_ue_ngap_id2ue_ctx);
return amf_ue_ngap_id2ue_ctx.size();
}
//---------------------------------------------------------------------------------------------
void amf_app::add_n1n2_message_subscription(
const std::string& ue_ctx_id, const n1n2sub_id_t& sub_id,
......
This diff is collapsed.
......@@ -221,22 +221,22 @@ class amf_n1 {
bool remove_supi_2_ran_id(const std::string& supi);
/*
* Get UE NAS context associated with an IMSI
* @param [const std::string&] imsi: UE IMSI
* Get UE NAS context associated with an SUPI
* @param [const std::string&] imsi: UE SUPI
* @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
* false
*/
bool imsi_2_nas_context(
bool supi_2_nas_context(
const std::string& imsi, std::shared_ptr<nas_context>&) const;
/*
* Store an UE NAS context associated with an IMSI
* @param [const std::string&] imsi: UE IMSI
* Store an UE NAS context associated with an SUPI
* @param [const std::string&] imsi: UE SUPI
* @param [const std::shared_ptr<nas_context>&] nc: pointer to UE NAS context
* @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);
/*
......@@ -244,7 +244,7 @@ class amf_n1 {
* @param [const std::string&] imsi: UE IMSI
* @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
......@@ -991,7 +991,7 @@ class amf_n1 {
amfueid2nas_context; // amf ue ngap id
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, uint32_t> supi2ranId;
mutable std::shared_mutex m_nas_context;
......
......@@ -888,7 +888,7 @@ void amf_n2::handle_itti_message(itti_initial_context_setup_request& itti_msg) {
itti_msg.amf_ue_ngap_id);
// TODO:
}
string supi = "imsi-" + nc->imsi;
string supi = conv::imsi_to_supi(nc->imsi);
Logger::amf_n2().debug("SUPI (%s)", supi.c_str());
// Get S_NSSAI from PDU Session Context
......@@ -974,7 +974,7 @@ void amf_n2::handle_itti_message(
itti_msg.amf_ue_ngap_id);
// TODO:
}
string supi = "imsi-" + nc->imsi;
string supi = conv::imsi_to_supi(nc->imsi);
Logger::amf_n2().debug("SUPI (%s)", supi.c_str());
// Get SNSSAI info from PDU Session Context
......@@ -1196,7 +1196,7 @@ void amf_n2::handle_itti_message(itti_ue_context_release_command& itti_msg) {
itti_msg.amf_ue_ngap_id);
return;
}
string supi = "imsi-" + nc->imsi;
string supi = conv::imsi_to_supi(nc->imsi);
Logger::amf_n2().debug(
"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) {
// TODO: may consider releasing all exisiting PDU sessions
/*
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;
if (!amf_app_inst->get_pdu_sessions_context(supi, sessions_ctx)) {
Logger::amf_n2().debug("No PDU Session Context found");
......@@ -1556,7 +1556,7 @@ bool amf_n2::handle_itti_message(itti_handover_required& itti_msg) {
bstring knh_bs = blk2bstr(knh, 32);
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(
"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) {
return;
}
string supi = "imsi-" + nc->imsi;
string supi = conv::imsi_to_supi(nc->imsi);
// Send PDUSessionUpdateSMContextRequest to SMF for all associated PDU
// sessions
......@@ -1890,7 +1890,7 @@ void amf_n2::handle_itti_message(itti_handover_notify& itti_msg) {
return;
}
string supi = "imsi-" + nc->imsi;
string supi = conv::imsi_to_supi(nc->imsi);
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(
std::shared_ptr<nas_context> nc = {};
if (amf_n1_inst->amf_ue_id_2_nas_context(unc->amf_ue_ngap_id, nc)) {
// Remove all NAS context
string supi = "imsi-" + nc->imsi;
string supi = conv::imsi_to_supi(nc->imsi);
if (nc->is_stacs_available) {
stacs.update_5gmm_state(nc->imsi, "5GMM-DEREGISTERED");
}
......@@ -2195,7 +2195,7 @@ void amf_n2::remove_ue_context_with_ran_ue_ngap_id(
amf_n1_inst->event_sub.ue_loss_of_connectivity(
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);
amf_n1_inst->remove_amf_ue_ngap_id_2_nas_context(unc->amf_ue_ngap_id);
// Update UE status
......@@ -2271,7 +2271,7 @@ void amf_n2::remove_ue_context_with_amf_ue_ngap_id(
std::shared_ptr<nas_context> nc = {};
if (amf_n1_inst->amf_ue_id_2_nas_context(amf_ue_ngap_id, nc)) {
// Remove all NAS context
string supi = "imsi-" + nc->imsi;
string supi = conv::imsi_to_supi(nc->imsi);
// Update UE status
if (nc->is_stacs_available) {
stacs.update_5gmm_state(nc->imsi, "5GMM-DEREGISTERED");
......@@ -2283,7 +2283,7 @@ void amf_n2::remove_ue_context_with_amf_ue_ngap_id(
amf_n1_inst->event_sub.ue_loss_of_connectivity(
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);
amf_n1_inst->remove_amf_ue_ngap_id_2_nas_context(amf_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) {
return;
}
std::string supi = "imsi-" + nc->imsi;
string supi = conv::imsi_to_supi(nc->imsi);
string ue_context_key =
conv::get_ue_context_key(nc->ran_ue_ngap_id, nc->amf_ue_ngap_id);
std::shared_ptr<ue_context> uc = {};
......
......@@ -33,6 +33,9 @@
#include "amf.hpp"
#include "logger.hpp"
constexpr uint8_t kUint32Length =
8; // 4 bytes -8 characters representation in hex
static const char hex_to_ascii_table[16] = {
'0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', 'a', 'b', 'c', 'd', 'e', 'f',
......@@ -110,8 +113,8 @@ std::string conv::mncToString(
//------------------------------------------------------------------------------
std::string conv::tmsi_to_string(const uint32_t tmsi) {
std::string s = {};
std::string tmsi_str = std::to_string(tmsi);
uint8_t length = 4 - tmsi_str.size();
std::string tmsi_str = uint32_to_hex_string(tmsi);
uint8_t length = kUint32Length - tmsi_str.size();
for (uint8_t i = 0; i < length; i++) {
s.append("0");
}
......@@ -491,3 +494,35 @@ std::string conv::get_serving_network_name(
snn = "5G:mnc" + mnc + ".mcc" + mcc + ".3gppnetwork.org";
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 {
const uint32_t ran_ue_ngap_id, long amf_ue_ngap_id);
static std::string get_serving_network_name(
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 */
......@@ -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);
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->n2sm = blk2bstr(
list[0].pduSessionResourceSetupResponseTransfer.buf,
......@@ -503,7 +503,7 @@ int ngap_amf_handle_pdu_session_resource_setup_response(
return RETURNerror;
}
string supi = "imsi-" + nct->imsi;
string supi = conv::imsi_to_supi(nct->imsi);
std::shared_ptr<pdu_session_context> psc = {};
if (amf_app_inst->find_pdu_session_context(
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