Commit b48bf8bd authored by Tien Thinh NGUYEN's avatar Tien Thinh NGUYEN

Fix mapping between RAN UE NGAP ID and UE context

parent 280954f5
......@@ -387,11 +387,14 @@ void amf_app::handle_itti_message(
// Update AMF UE NGAP ID
std::shared_ptr<ue_ngap_context> unc = {};
if (!amf_n2_inst->ran_ue_id_2_ue_ngap_context(itti_msg.ran_ue_ngap_id, unc)) {
if (!amf_n2_inst->ran_ue_id_2_ue_ngap_context(
itti_msg.ran_ue_ngap_id, itti_msg.gnb_id, unc)) {
Logger::amf_n1().error(
"Could not find UE NGAP Context with ran_ue_ngap_id "
"(" GNB_UE_NGAP_ID_FMT ")",
itti_msg.ran_ue_ngap_id);
"(" GNB_UE_NGAP_ID_FMT
"), gNB ID "
"(" GNB_ID_FMT ")",
itti_msg.ran_ue_ngap_id, itti_msg.gnb_id);
} else {
unc->amf_ue_ngap_id = amf_ue_ngap_id;
amf_n2_inst->set_amf_ue_ngap_id_2_ue_ngap_context(amf_ue_ngap_id, unc);
......@@ -409,6 +412,7 @@ void amf_app::handle_itti_message(
uc->ran_ue_ngap_id = itti_msg.ran_ue_ngap_id;
uc->amf_ue_ngap_id = amf_ue_ngap_id;
uc->gnb_id = itti_msg.gnb_id;
std::string guti = {};
bool is_guti_valid = false;
......@@ -472,11 +476,10 @@ void amf_app::handle_itti_message(itti_sbi_n1_message_notification& itti_msg) {
registration_context.getRanNodeId();
// RAN UE NGAP ID
uint32_t ran_ue_ngap_id = registration_context.getAnN2ApId();
uint32_t gnb_id = {};
if (ran_node_id.gNbIdIsSet()) {
oai::amf::model::GNbId gnb_id_model = ran_node_id.getGNbId();
uint32_t gnb_id = {};
try {
gnb_id = std::stoul(gnb_id_model.getGNBValue(), nullptr, 10);
} catch (const std::exception& e) {
......@@ -517,6 +520,7 @@ void amf_app::handle_itti_message(itti_sbi_n1_message_notification& itti_msg) {
uc = std::shared_ptr<ue_context>(new ue_context());
uc->amf_ue_ngap_id = -1;
uc->supi = supi;
uc->gnb_id = gnb_id;
set_supi_2_ue_context(supi, uc);
}
}
......@@ -555,6 +559,7 @@ void amf_app::handle_itti_message(itti_sbi_n1_message_notification& itti_msg) {
"Create a new UE Context with UE Context Key",
ue_context_key.c_str());
uc = std::make_shared<ue_context>();
uc->gnb_id = gnb_id;
}
set_ran_amf_id_2_ue_context(ue_context_key, uc);
}
......@@ -583,12 +588,13 @@ void amf_app::handle_itti_message(itti_sbi_n1_message_notification& itti_msg) {
// Step 4. Create UE NGAP Context if necessary
// Create/Update UE NGAP Context
std::shared_ptr<ue_ngap_context> unc = {};
if (!amf_n2_inst->ran_ue_id_2_ue_ngap_context(ran_ue_ngap_id, unc)) {
if (!amf_n2_inst->ran_ue_id_2_ue_ngap_context(ran_ue_ngap_id, gnb_id, unc)) {
Logger::amf_app().debug(
"Create a new UE NGAP context with ran_ue_ngap_id " GNB_UE_NGAP_ID_FMT,
ran_ue_ngap_id);
unc = std::shared_ptr<ue_ngap_context>(new ue_ngap_context());
amf_n2_inst->set_ran_ue_ngap_id_2_ue_ngap_context(ran_ue_ngap_id, unc);
amf_n2_inst->set_ran_ue_ngap_id_2_ue_ngap_context(
ran_ue_ngap_id, gnb_id, unc);
}
// Store related information into UE NGAP context
......
......@@ -1270,7 +1270,8 @@ void amf_n1::registration_request_handle(
if (uc) uc.reset();
std::shared_ptr<ue_ngap_context> unc = {};
if (!amf_n2_inst->ran_ue_id_2_ue_ngap_context(ran_ue_ngap_id, unc)) {
if (!amf_n2_inst->ran_ue_id_2_ue_ngap_context(
ran_ue_ngap_id, uc->gnb_id, unc)) {
Logger::amf_n1().error(
"No UE NGAP context with ran_ue_ngap_id (" GNB_UE_NGAP_ID_FMT ")",
ran_ue_ngap_id);
......@@ -2618,7 +2619,8 @@ void amf_n1::security_mode_complete_handle(
// Find UE context
std::shared_ptr<ue_ngap_context> unc = {};
if (!amf_n2_inst->ran_ue_id_2_ue_ngap_context(ran_ue_ngap_id, unc)) {
if (!amf_n2_inst->ran_ue_id_2_ue_ngap_context(
ran_ue_ngap_id, uc->gnb_id, unc)) {
Logger::amf_n1().warn(
"No UE NGAP context with ran_ue_ngap_id (" GNB_UE_NGAP_ID_FMT ")",
ran_ue_ngap_id);
......@@ -4122,7 +4124,7 @@ void amf_n1::initialize_registration_accept(
// Allowed/Rejected/Configured NSSAI
// Get the list of common SST, SD between UE and AMF
std::vector<struct SNSSAI_s> common_nssais;
amf_n2_inst->get_common_NSSAI(nc->ran_ue_ngap_id, common_nssais);
amf_n2_inst->get_common_NSSAI(nc->ran_ue_ngap_id, uc->gnb_id, common_nssais);
std::vector<struct SNSSAI_s> allowed_nssais;
std::vector<Rejected_SNSSAI> rejected_nssais;
......@@ -4747,7 +4749,8 @@ bool amf_n1::get_slice_selection_subscription_data_from_conf_file(
// Get UE NGAP Context
std::shared_ptr<ue_ngap_context> unc = {};
if (!amf_n2_inst->ran_ue_id_2_ue_ngap_context(nc->ran_ue_ngap_id, unc)) {
if (!amf_n2_inst->ran_ue_id_2_ue_ngap_context(
nc->ran_ue_ngap_id, uc->gnb_id, unc)) {
Logger::amf_n1().error(
"No existed UE NGAP context associated with "
"ran_ue_ngap_id " GNB_UE_NGAP_ID_FMT,
......
......@@ -247,9 +247,13 @@ amf_n2::~amf_n2() {}
void amf_n2::handle_itti_message(itti_paging& itti_msg) {
Logger::amf_n2().debug("Handle Paging message...");
// Get UE NGAP Context
std::shared_ptr<ue_ngap_context> unc = {};
string ue_context_key = conv::get_ue_context_key(
itti_msg.ran_ue_ngap_id, itti_msg.amf_ue_ngap_id);
if (!ran_ue_id_2_ue_ngap_context(itti_msg.ran_ue_ngap_id, unc)) {
if (!ran_ue_id_2_ue_ngap_context(
itti_msg.ran_ue_ngap_id, ue_context_key, unc)) {
Logger::amf_n2().error(
"No UE NGAP context with ran_ue_ngap_id (" GNB_UE_NGAP_ID_FMT ")",
itti_msg.ran_ue_ngap_id);
......@@ -493,7 +497,8 @@ void amf_n2::handle_itti_message(itti_ng_reset& itti_msg) {
for (auto ue_context : ue_contexts) {
remove_ue_context_with_amf_ue_ngap_id(ue_context->amf_ue_ngap_id);
remove_ue_context_with_ran_ue_ngap_id(ue_context->ran_ue_ngap_id);
remove_ue_context_with_ran_ue_ngap_id(
ue_context->ran_ue_ngap_id, gc->globalRanNodeId);
}
stacs.display();
......@@ -508,7 +513,8 @@ void amf_n2::handle_itti_message(itti_ng_reset& itti_msg) {
if (ue.getAmfUeNgapId(amf_ue_ngap_id)) {
remove_ue_context_with_amf_ue_ngap_id(amf_ue_ngap_id);
} else if (ue.getRanUeNgapId(ran_ue_ngap_id)) {
remove_ue_context_with_ran_ue_ngap_id(ran_ue_ngap_id);
remove_ue_context_with_ran_ue_ngap_id(
ran_ue_ngap_id, gc->globalRanNodeId);
}
}
}
......@@ -549,7 +555,8 @@ void amf_n2::handle_itti_message(itti_ng_shutdown& itti_msg) {
for (auto ue_context : ue_contexts) {
remove_ue_context_with_amf_ue_ngap_id(ue_context->amf_ue_ngap_id);
remove_ue_context_with_ran_ue_ngap_id(ue_context->ran_ue_ngap_id);
remove_ue_context_with_ran_ue_ngap_id(
ue_context->ran_ue_ngap_id, gc->globalRanNodeId);
}
// Delete gNB context
......@@ -604,12 +611,13 @@ void amf_n2::handle_itti_message(itti_initial_ue_message& init_ue_msg) {
}
std::shared_ptr<ue_ngap_context> unc = {};
if (!ran_ue_id_2_ue_ngap_context(ran_ue_ngap_id, unc)) {
if (!ran_ue_id_2_ue_ngap_context(ran_ue_ngap_id, gc->globalRanNodeId, unc)) {
Logger::amf_n2().debug(
"Create a new UE NGAP context with ran_ue_ngap_id " GNB_UE_NGAP_ID_FMT,
ran_ue_ngap_id);
unc = std::make_shared<ue_ngap_context>();
set_ran_ue_ngap_id_2_ue_ngap_context(ran_ue_ngap_id, unc);
set_ran_ue_ngap_id_2_ue_ngap_context(
ran_ue_ngap_id, gc->globalRanNodeId, unc);
}
// Store related information into UE NGAP context
......@@ -683,6 +691,7 @@ void amf_n2::handle_itti_message(itti_initial_ue_message& init_ue_msg) {
}
}
itti_msg->gnb_id = gc->globalRanNodeId;
itti_msg->ran_ue_ngap_id = ran_ue_ngap_id;
itti_msg->amf_ue_ngap_id = INVALID_AMF_UE_NGAP_ID;
......@@ -708,7 +717,7 @@ void amf_n2::handle_itti_message(itti_ul_nas_transport& ul_nas_transport) {
}
std::shared_ptr<ue_ngap_context> unc = {};
if (!ran_ue_id_2_ue_ngap_context(ran_ue_ngap_id, unc)) {
if (!ran_ue_id_2_ue_ngap_context(ran_ue_ngap_id, gc->globalRanNodeId, unc)) {
Logger::amf_n2().error(
"UE with ran_ue_ngap_id (" GNB_UE_NGAP_ID_FMT
") is not attached to gnb with assoc_id "
......@@ -769,10 +778,13 @@ void amf_n2::handle_itti_message(itti_ul_nas_transport& ul_nas_transport) {
void amf_n2::handle_itti_message(itti_dl_nas_transport& dl_nas_transport) {
Logger::amf_n2().debug("Handle DL NAS Transport ...");
// Get UE NGAP Context
std::shared_ptr<ue_ngap_context> unc = {};
string ue_context_key = conv::get_ue_context_key(
dl_nas_transport.ran_ue_ngap_id, dl_nas_transport.amf_ue_ngap_id);
if (!amf_n2_inst->ran_ue_id_2_ue_ngap_context(
dl_nas_transport.ran_ue_ngap_id, unc)) {
dl_nas_transport.ran_ue_ngap_id, ue_context_key, unc)) {
Logger::amf_n2().error(
"No UE NGAP context with ran_ue_ngap_id (" GNB_UE_NGAP_ID_FMT ")",
dl_nas_transport.ran_ue_ngap_id);
......@@ -806,8 +818,13 @@ void amf_n2::handle_itti_message(itti_dl_nas_transport& dl_nas_transport) {
void amf_n2::handle_itti_message(itti_initial_context_setup_request& itti_msg) {
Logger::amf_n2().debug("Handle Initial Context Setup Request ...");
// Get UE NGAP Context
std::shared_ptr<ue_ngap_context> unc = {};
if (!amf_n2_inst->ran_ue_id_2_ue_ngap_context(itti_msg.ran_ue_ngap_id, unc)) {
std::string ue_context_key = conv::get_ue_context_key(
itti_msg.ran_ue_ngap_id, itti_msg.amf_ue_ngap_id);
if (!amf_n2_inst->ran_ue_id_2_ue_ngap_context(
itti_msg.ran_ue_ngap_id, ue_context_key, unc)) {
Logger::amf_n2().error(
"No UE NGAP context with ran_ue_ngap_id (" GNB_UE_NGAP_ID_FMT ")",
itti_msg.ran_ue_ngap_id);
......@@ -943,8 +960,13 @@ void amf_n2::handle_itti_message(
itti_pdu_session_resource_setup_request& itti_msg) {
Logger::amf_n2().debug("Handle PDU Session Resource Setup Request ...");
// Get UE NGAP Context
std::shared_ptr<ue_ngap_context> unc = {};
if (!amf_n2_inst->ran_ue_id_2_ue_ngap_context(itti_msg.ran_ue_ngap_id, unc)) {
std::string ue_context_key = conv::get_ue_context_key(
itti_msg.ran_ue_ngap_id, itti_msg.amf_ue_ngap_id);
if (!amf_n2_inst->ran_ue_id_2_ue_ngap_context(
itti_msg.ran_ue_ngap_id, ue_context_key, unc)) {
Logger::amf_n2().error(
"No UE NGAP context with ran_ue_ngap_id (" GNB_UE_NGAP_ID_FMT ")",
itti_msg.ran_ue_ngap_id);
......@@ -1024,8 +1046,13 @@ void amf_n2::handle_itti_message(
itti_pdu_session_resource_modify_request& itti_msg) {
Logger::amf_n2().debug("Handle PDU Session Resource Modify Request ...");
// Get UE NGAP Context
std::shared_ptr<ue_ngap_context> unc = {};
if (!amf_n2_inst->ran_ue_id_2_ue_ngap_context(itti_msg.ran_ue_ngap_id, unc)) {
std::string ue_context_key = conv::get_ue_context_key(
itti_msg.ran_ue_ngap_id, itti_msg.amf_ue_ngap_id);
if (!amf_n2_inst->ran_ue_id_2_ue_ngap_context(
itti_msg.ran_ue_ngap_id, ue_context_key, unc)) {
Logger::amf_n2().error(
"No UE NGAP context with ran_ue_ngap_id (" GNB_UE_NGAP_ID_FMT ")",
itti_msg.ran_ue_ngap_id);
......@@ -1081,8 +1108,13 @@ void amf_n2::handle_itti_message(
itti_pdu_session_resource_release_command& itti_msg) {
Logger::amf_n2().debug("Handle PDU Session Resource Release Command ...");
// Get UE NGAP Context
std::shared_ptr<ue_ngap_context> unc = {};
if (!amf_n2_inst->ran_ue_id_2_ue_ngap_context(itti_msg.ran_ue_ngap_id, unc)) {
std::string ue_context_key = conv::get_ue_context_key(
itti_msg.ran_ue_ngap_id, itti_msg.amf_ue_ngap_id);
if (!amf_n2_inst->ran_ue_id_2_ue_ngap_context(
itti_msg.ran_ue_ngap_id, ue_context_key, unc)) {
Logger::amf_n2().error(
"No UE NGAP context with ran_ue_ngap_id (" GNB_UE_NGAP_ID_FMT ")",
itti_msg.ran_ue_ngap_id);
......@@ -1153,8 +1185,13 @@ void amf_n2::handle_itti_message(itti_ue_context_release_request& itti_msg) {
void amf_n2::handle_itti_message(itti_ue_context_release_command& itti_msg) {
Logger::amf_n2().debug("Handling UE Context Release Command ...");
// Get UE NGAP Context
std::shared_ptr<ue_ngap_context> unc = {};
if (!amf_n2_inst->ran_ue_id_2_ue_ngap_context(itti_msg.ran_ue_ngap_id, unc)) {
std::string ue_context_key = conv::get_ue_context_key(
itti_msg.ran_ue_ngap_id, itti_msg.amf_ue_ngap_id);
if (!amf_n2_inst->ran_ue_id_2_ue_ngap_context(
itti_msg.ran_ue_ngap_id, ue_context_key, unc)) {
Logger::amf_n2().error(
"No UE NGAP context with ran_ue_ngap_id (" GNB_UE_NGAP_ID_FMT ")",
itti_msg.ran_ue_ngap_id);
......@@ -1269,6 +1306,17 @@ void amf_n2::handle_itti_message(itti_ue_context_release_complete& itti_msg) {
unsigned long amf_ue_ngap_id = itti_msg.ueCtxRelCmpl->getAmfUeNgapId();
uint32_t ran_ue_ngap_id = itti_msg.ueCtxRelCmpl->getRanUeNgapId();
// Get UE Context
string ue_context_key =
conv::get_ue_context_key(ran_ue_ngap_id, amf_ue_ngap_id);
std::shared_ptr<ue_context> uc = {};
if (!amf_app_inst->ran_amf_id_2_ue_context(ue_context_key, uc)) {
Logger::amf_app().error(
"No UE context for ran_amf_id %s, exit", ue_context_key.c_str());
return;
}
// Change UE status from CM-CONNECTED to CM-IDLE
std::shared_ptr<nas_context> nc = {};
if (!amf_n1_inst->amf_ue_id_2_nas_context(amf_ue_ngap_id, nc)) {
......@@ -1388,7 +1436,7 @@ void amf_n2::handle_itti_message(itti_ue_context_release_complete& itti_msg) {
}
// Remove UE NGAP context
remove_ue_context_with_ran_ue_ngap_id(ran_ue_ngap_id);
remove_ue_context_with_ran_ue_ngap_id(ran_ue_ngap_id, uc->gnb_id);
}
//------------------------------------------------------------------------------
......@@ -1428,7 +1476,7 @@ bool amf_n2::handle_itti_message(itti_handover_required& itti_msg) {
gc->gnb_name.c_str(), gc->globalRanNodeId);
std::shared_ptr<ue_ngap_context> unc = {};
if (!ran_ue_id_2_ue_ngap_context(ran_ue_ngap_id, unc)) {
if (!ran_ue_id_2_ue_ngap_context(ran_ue_ngap_id, gc->globalRanNodeId, unc)) {
Logger::amf_n2().error(
"No UE NGAP context with ran_ue_ngap_id (" GNB_UE_NGAP_ID_FMT ")",
ran_ue_ngap_id);
......@@ -1996,7 +2044,8 @@ void amf_n2::handle_itti_message(itti_handover_notify& itti_msg) {
unc->target_ran_ue_ngap_id = 0; // Clear target RAN ID
unc->ng_ue_state = NGAP_UE_CONNECTED;
unc->gnb_assoc_id = itti_msg.assoc_id; // update serving gNB
set_ran_ue_ngap_id_2_ue_ngap_context(ran_ue_ngap_id, unc);
set_ran_ue_ngap_id_2_ue_ngap_context(
ran_ue_ngap_id, gc->globalRanNodeId, unc);
}
//------------------------------------------------------------------------------
......@@ -2069,9 +2118,13 @@ void amf_n2::handle_itti_message(itti_uplink_ran_status_transfer& itti_msg) {
void amf_n2::handle_itti_message(itti_rereoute_nas& itti_msg) {
Logger::amf_n2().debug("Handle Reroute NAS Request message...");
// Get UE NGAP Context
std::shared_ptr<ue_ngap_context> unc = {};
std::string ue_context_key = conv::get_ue_context_key(
itti_msg.ran_ue_ngap_id, itti_msg.amf_ue_ngap_id);
if (!ran_ue_id_2_ue_ngap_context(itti_msg.ran_ue_ngap_id, unc)) {
if (!ran_ue_id_2_ue_ngap_context(
itti_msg.ran_ue_ngap_id, ue_context_key, unc)) {
Logger::amf_n2().error(
"No UE NGAP context with ran_ue_ngap_id " GNB_UE_NGAP_ID_FMT,
itti_msg.ran_ue_ngap_id);
......@@ -2128,10 +2181,11 @@ void amf_n2::send_handover_preparation_failure(
//------------------------------------------------------------------------------
bool amf_n2::is_ran_ue_id_2_ue_ngap_context(
const uint32_t& ran_ue_ngap_id) const {
uint32_t ran_ue_ngap_id, uint32_t gnb_id) const {
std::shared_lock lock(m_ranid2uecontext);
if (ranid2uecontext.count(ran_ue_ngap_id) > 0) {
if (ranid2uecontext.at(ran_ue_ngap_id) != nullptr) {
std::pair<uint32_t, uint32_t> ue_id = std::make_pair(ran_ue_ngap_id, gnb_id);
if (ranid2uecontext.count(ue_id) > 0) {
if (ranid2uecontext.at(ue_id) != nullptr) {
return true;
}
}
......@@ -2140,12 +2194,36 @@ bool amf_n2::is_ran_ue_id_2_ue_ngap_context(
//------------------------------------------------------------------------------
bool amf_n2::ran_ue_id_2_ue_ngap_context(
const uint32_t& ran_ue_ngap_id,
uint32_t ran_ue_ngap_id, uint32_t gnb_id,
std::shared_ptr<ue_ngap_context>& unc) const {
auto ue_id = std::make_pair(ran_ue_ngap_id, gnb_id);
std::shared_lock lock(m_ranid2uecontext);
if (ranid2uecontext.count(ran_ue_ngap_id) > 0) {
if (ranid2uecontext.at(ran_ue_ngap_id) != nullptr) {
unc = ranid2uecontext.at(ran_ue_ngap_id);
if (ranid2uecontext.count(ue_id) > 0) {
if (ranid2uecontext.at(ue_id) != nullptr) {
unc = ranid2uecontext.at(ue_id);
return true;
}
}
return false;
}
//------------------------------------------------------------------------------
bool amf_n2::ran_ue_id_2_ue_ngap_context(
uint32_t ran_ue_ngap_id, const std::string& ue_context_key,
std::shared_ptr<ue_ngap_context>& unc) const {
// Get UE Context
std::shared_ptr<ue_context> uc = {};
if (!amf_app_inst->ran_amf_id_2_ue_context(ue_context_key, uc)) {
Logger::amf_app().error(
"No UE context for ran_amf_id %s, exit", ue_context_key.c_str());
return false;
}
auto ue_id = std::make_pair(ran_ue_ngap_id, uc->gnb_id);
std::shared_lock lock(m_ranid2uecontext);
if (ranid2uecontext.count(ue_id) > 0) {
if (ranid2uecontext.at(ue_id) != nullptr) {
unc = ranid2uecontext.at(ue_id);
return true;
}
}
......@@ -2154,28 +2232,30 @@ bool amf_n2::ran_ue_id_2_ue_ngap_context(
//------------------------------------------------------------------------------
void amf_n2::set_ran_ue_ngap_id_2_ue_ngap_context(
const uint32_t& ran_ue_ngap_id,
uint32_t ran_ue_ngap_id, uint32_t gnb_id,
const std::shared_ptr<ue_ngap_context>& unc) {
auto ue_id = std::make_pair(ran_ue_ngap_id, gnb_id);
std::unique_lock lock(m_ranid2uecontext);
ranid2uecontext[ran_ue_ngap_id] = unc;
ranid2uecontext[ue_id] = unc;
}
//------------------------------------------------------------------------------
void amf_n2::remove_ran_ue_ngap_id_2_ngap_context(
const uint32_t& ran_ue_ngap_id) {
uint32_t ran_ue_ngap_id, uint32_t gnb_id) {
auto ue_id = std::make_pair(ran_ue_ngap_id, gnb_id);
std::unique_lock lock(m_ranid2uecontext);
if (ranid2uecontext.count(ran_ue_ngap_id) > 0) {
ranid2uecontext.erase(ran_ue_ngap_id);
if (ranid2uecontext.count(ue_id) > 0) {
ranid2uecontext.erase(ue_id);
}
}
//------------------------------------------------------------------------------
void amf_n2::remove_ue_context_with_ran_ue_ngap_id(
const uint32_t& ran_ue_ngap_id) {
uint32_t ran_ue_ngap_id, uint32_t gnb_id) {
// Remove NAS context if still available
std::shared_ptr<ue_ngap_context> unc = {};
if (!ran_ue_id_2_ue_ngap_context(ran_ue_ngap_id, unc)) {
if (!ran_ue_id_2_ue_ngap_context(ran_ue_ngap_id, gnb_id, unc)) {
Logger::amf_n2().error(
"No UE NGAP context with ran_ue_ngap_id (" GNB_UE_NGAP_ID_FMT ")",
ran_ue_ngap_id);
......@@ -2210,7 +2290,7 @@ void amf_n2::remove_ue_context_with_ran_ue_ngap_id(
// Remove NGAP context
remove_amf_ue_ngap_id_2_ue_ngap_context(unc->amf_ue_ngap_id);
remove_ran_ue_ngap_id_2_ngap_context(ran_ue_ngap_id);
remove_ran_ue_ngap_id_2_ngap_context(ran_ue_ngap_id, gnb_id);
}
//------------------------------------------------------------------------------
......@@ -2289,7 +2369,17 @@ void amf_n2::remove_ue_context_with_amf_ue_ngap_id(
// 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
remove_ran_ue_ngap_id_2_ngap_context(nc->ran_ue_ngap_id);
// Get UE Context
string ue_context_key =
conv::get_ue_context_key(nc->ran_ue_ngap_id, amf_ue_ngap_id);
std::shared_ptr<ue_context> uc = {};
if (!amf_app_inst->ran_amf_id_2_ue_context(ue_context_key, uc)) {
Logger::amf_app().error(
"No UE context for ran_amf_id %s, exit", ue_context_key.c_str());
return;
}
remove_ran_ue_ngap_id_2_ngap_context(nc->ran_ue_ngap_id, uc->gnb_id);
} else {
Logger::amf_n2().warn(
......@@ -2360,13 +2450,15 @@ bool amf_n2::get_common_plmn(
//------------------------------------------------------------------------------
bool amf_n2::get_common_NSSAI(
const uint32_t& ran_ue_ngap_id, std::vector<nas::SNSSAI_t>& common_nssai) {
const uint32_t& ran_ue_ngap_id, uint32_t gnb_id,
std::vector<nas::SNSSAI_t>& common_nssai) {
Logger::amf_n2().debug("Getting common S-NSSAIs between gNB and AMF");
bool found = false;
// Get UE NGAP Context
std::shared_ptr<ue_ngap_context> unc = {};
if (!ran_ue_id_2_ue_ngap_context(ran_ue_ngap_id, unc)) {
if (!ran_ue_id_2_ue_ngap_context(ran_ue_ngap_id, gnb_id, unc)) {
Logger::amf_n2().error(
"No UE NGAP context with ran_ue_ngap_id (" GNB_UE_NGAP_ID_FMT ")",
ran_ue_ngap_id);
......
......@@ -222,36 +222,54 @@ class amf_n2 : public ngap::ngap_app {
* @return void
*/
bool get_common_NSSAI(
const uint32_t& ran_ue_ngap_id, std::vector<nas::SNSSAI_t>& common_nssai);
const uint32_t& ran_ue_ngap_id, uint32_t gnb_id,
std::vector<nas::SNSSAI_t>& common_nssai);
/*
* Get the UE NGAP context associated with a RAN UE NGAP ID if it exists and
* not null
* @param [const uint32_t&] ran_ue_ngap_id: RAN UE NGAP ID
* @param [const uint32_t&] gnb_id: gNB ID
* @param [std::shared_ptr<ue_ngap_context>&] unc: shared pointer to the
* existing UE NGAP context
* @return true if the context exists and is not null, otherwise return false
*/
bool ran_ue_id_2_ue_ngap_context(
const uint32_t& ran_ue_ngap_id,
uint32_t ran_ue_ngap_id, uint32_t gnb_id,
std::shared_ptr<ue_ngap_context>& unc) const;
/*
* Get the UE NGAP context associated with a RAN UE NGAP ID if it exists and
* not null
* @param [const uint32_t&] ran_ue_ngap_id: RAN UE NGAP ID
* @param [const std::string&] ue_context_key: UE context key from AMF UE NGAP
* ID and RAN UE NGAP ID
* @param [std::shared_ptr<ue_ngap_context>&] unc: shared pointer to the
* existing UE NGAP context
* @return true if the context exists and is not null, otherwise return false
*/
bool ran_ue_id_2_ue_ngap_context(
uint32_t ran_ue_ngap_id, const std::string& ue_context_key,
std::shared_ptr<ue_ngap_context>& unc) const;
/*
* Verify whether a UE NGAP context associated with a RAN UE NGAP ID exists
* @param [const uint32_t&] ran_ue_ngap_id: RAN UE NGAP ID
* @param [const uint32_t&] gnb_id: gNB ID
* @return true if the context exists and is not null, otherwise return false
*/
bool is_ran_ue_id_2_ue_ngap_context(const uint32_t& ran_ue_ngap_id) const;
bool is_ran_ue_id_2_ue_ngap_context(
uint32_t ran_ue_ngap_id, uint32_t gnb_id) const;
/*
* Store UE NGAP context associated with a RAN UE NGAP ID
* @param [const uint32_t&] ran_ue_ngap_id: RAN UE NGAP ID
* @param [const uint32_t&] gnb_id: gNB ID
* @param [const std::shared_ptr<ue_ngap_context>&] unc: pointer to UE NGAP
* context
* @return void
*/
void set_ran_ue_ngap_id_2_ue_ngap_context(
const uint32_t& ran_ue_ngap_id,
uint32_t ran_ue_ngap_id, uint32_t gnb_id,
const std::shared_ptr<ue_ngap_context>& unc);
/*
......@@ -259,14 +277,16 @@ class amf_n2 : public ngap::ngap_app {
* @param [const uint32_t&] ran_ue_ngap_id: RAN UE NGAP ID
* @return void
*/
void remove_ran_ue_ngap_id_2_ngap_context(const uint32_t& ran_ue_ngap_id);
void remove_ran_ue_ngap_id_2_ngap_context(
uint32_t ran_ue_ngap_id, uint32_t gnb_id);
/*
* Remove UE Context associated with a RAN UE NGAP ID
* @param [const uint32_t&] ran_ue_ngap_id: RAN UE NGAP ID
* @return void
*/
void remove_ue_context_with_ran_ue_ngap_id(const uint32_t& ran_ue_ngap_id);
void remove_ue_context_with_ran_ue_ngap_id(
uint32_t ran_ue_ngap_id, uint32_t gnb_id);
/*
* Verify whether a UE NGAP context associated with a AMF UE NGAP ID exists
......@@ -328,7 +348,7 @@ class amf_n2 : public ngap::ngap_app {
std::vector<std::shared_ptr<ue_ngap_context>>& ue_contexts);
private:
std::map<uint32_t, std::shared_ptr<ue_ngap_context>>
std::map<std::pair<uint32_t, uint32_t>, std::shared_ptr<ue_ngap_context>>
ranid2uecontext; // ran ue ngap id
mutable std::shared_mutex m_ranid2uecontext;
......
......@@ -39,6 +39,7 @@ constexpr auto CURL_MIME_BOUNDARY = "----Boundary";
#define FUTURE_STATUS_TIMEOUT_MS 100
#define GNB_ID_FMT "%" PRIu32
#define GNB_UE_NGAP_ID_FMT "%" PRIu32
#define AMF_UE_NGAP_ID_FMT "%" PRIu64
......
......@@ -54,7 +54,7 @@ class gnb_context {
ng_gnb_state_t ng_state;
std::string gnb_name;
long globalRanNodeId;
uint32_t globalRanNodeId;
plmn_t plmn;
e_Ngap_PagingDRX default_paging_drx; // v32, v64, v128, v256
std::vector<SupportedTaItem_t> s_ta_list;
......
......@@ -25,6 +25,7 @@
ue_context::ue_context() {
ran_ue_ngap_id = 0;
amf_ue_ngap_id = -1;
gnb_id = 0;
rrc_estb_cause = {};
isUeContextRequest = false;
cgi = {};
......
......@@ -57,6 +57,7 @@ class ue_context {
public:
uint32_t ran_ue_ngap_id; // 32bits
long amf_ue_ngap_id : 40; // 40bits
uint32_t gnb_id;
e_Ngap_RRCEstablishmentCause rrc_estb_cause;
bool isUeContextRequest;
......
......@@ -35,15 +35,18 @@ class itti_msg_amf_app : public itti_msg {
const itti_msg_type_t msg_type, const task_id_t origin,
const task_id_t destination)
: itti_msg(msg_type, origin, destination) {
gnb_id = 0;
ran_ue_ngap_id = 0;
amf_ue_ngap_id = 0;
}
itti_msg_amf_app(const itti_msg_amf_app& i) : itti_msg(i) {
gnb_id = i.gnb_id;
ran_ue_ngap_id = i.ran_ue_ngap_id;
amf_ue_ngap_id = i.amf_ue_ngap_id;
}
uint32_t gnb_id;
uint32_t ran_ue_ngap_id;
long amf_ue_ngap_id;
};
......
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