Commit 5d65c90e authored by Niuhaiwen's avatar Niuhaiwen

stateless-n2-initial_ue_message-procedure

parent a7d2d518
......@@ -303,6 +303,105 @@ void amf_app::handle_itti_msg(itti_n11_register_nf_instance_response& r){
//------------------------------------------------------------------------------
void amf_app::handle_itti_message(
itti_nas_signalling_establishment_request& itti_msg) {
// get ue_context
Logger::amf_app().debug("Try to get ue_context from UDSF");
long amf_ue_ngap_id = 0;
if ((amf_ue_ngap_id = itti_msg.amf_ue_ngap_id) == -1) {
amf_ue_ngap_id = generate_amf_ue_ngap_id();
}else{
amf_ue_ngap_id = itti_msg.amf_ue_ngap_id;
}
nlohmann::json udsf_response;
std::shared_ptr<ue_context> uc = std::shared_ptr<ue_context>(new ue_context());
string ue_context_key = "app_ue_ranid_" + to_string(itti_msg.ran_ue_ngap_id) + "-amfid_" + to_string(amf_ue_ngap_id);
std::string record_id = "amf_ue_ngap_id=\'" + to_string(amf_ue_ngap_id) + "\'";
std::string udsf_url = "http://10.103.239.53:7123/nudsf-dr/v1/amfdata/" + std::string("ue_context/records/") + record_id ;
//std::string udsf_url = "http://10.103.239.53:7123/nudsf-dr/v1/amfdata/" + std::string("ue_context/records/") + "RECORD_ID = \'" + ue_context_key + "\'";
if(!amf_n2_inst->curl_http_client_udsf(udsf_url,"","GET",udsf_response)){
Logger::amf_n2().error("No existing ue_context with ue_context_key ...");
}else if(udsf_response.dump().length()<8){
Logger::amf_n2().error("No existing ue_context with ue_context_key .....");
}else{
Logger::amf_n2().debug("udsf_response: %s", udsf_response.dump().c_str());
uc.get()->ue_context_from_json(udsf_response);
}
set_ran_amf_id_2_ue_context(ue_context_key, uc);
// Update ue_context
uc.get()->cgi = itti_msg.cgi;
uc.get()->tai = itti_msg.tai;
if (itti_msg.rrc_cause != -1)
uc.get()->rrc_estb_cause =
(e_Ngap_RRCEstablishmentCause) itti_msg.rrc_cause;
if (itti_msg.ueCtxReq == -1)
uc.get()->isUeContextRequest = false;
else
uc.get()->isUeContextRequest = true;
uc.get()->ran_ue_ngap_id = itti_msg.ran_ue_ngap_id;
uc.get()->amf_ue_ngap_id = amf_ue_ngap_id;
// send to TASK_AMF_N1
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;
is_guti_valid = true;
Logger::amf_app().debug("Receiving GUTI %s", guti.c_str());
}
itti_uplink_nas_data_ind* itti_n1_msg =
new itti_uplink_nas_data_ind(TASK_AMF_APP, TASK_AMF_N1);
itti_n1_msg->amf_ue_ngap_id = amf_ue_ngap_id;
itti_n1_msg->ran_ue_ngap_id = itti_msg.ran_ue_ngap_id;
itti_n1_msg->is_nas_signalling_estab_req = true;
itti_n1_msg->nas_msg = itti_msg.nas_buf;
itti_n1_msg->mcc = itti_msg.tai.mcc;
itti_n1_msg->mnc = itti_msg.tai.mnc;
itti_n1_msg->is_guti_valid = is_guti_valid;
if (is_guti_valid) {
itti_n1_msg->guti = guti;
}
std::shared_ptr<itti_uplink_nas_data_ind> i =
std::shared_ptr<itti_uplink_nas_data_ind>(itti_n1_msg);
int ret = itti_inst->send_msg(i);
if (0 != ret) {
Logger::amf_app().error(
"Could not send ITTI message %s to task TASK_AMF_N1",
i->get_msg_name());
}
//Update ue_context to UDSF
record_id = "amf_ue_ngap_id=\'" + to_string(amf_ue_ngap_id) + "\'";
udsf_url = "http://10.103.239.53:7123/nudsf-dr/v1/amfdata/" + std::string("ue_context/records/") + record_id ;
nlohmann::json udsf_ue_context;
nlohmann::json cgi;
cgi["Content-ID"] = "cgi";
cgi["Content-Type"] = "JSON";
cgi["content"]["mcc"] = uc.get()->cgi.mcc;
cgi["content"]["mnc"] = uc.get()->cgi.mnc;
cgi["content"]["nrCellID"] = to_string(uc.get()->cgi.nrCellID);
nlohmann::json tai;
tai["Content-ID"] = "tai";
tai["Content-Type"] = "JSON";
tai["content"]["mcc"] = uc.get()->tai.mcc;
tai["content"]["mnc"] = uc.get()->tai.mnc;
tai["content"]["tac"] = to_string(uc.get()->tai.tac);
udsf_ue_context["meta"] ["tags"] = {
{"RECORD_ID",nlohmann::json::array({ue_context_key})},
{"from_nf_ID",nlohmann::json::array({"AMF_1234"})}
} ;
udsf_ue_context["blocks"] = nlohmann::json::array({
{{"Content-ID", "ran_ue_ngap_id"},{"Content-Type", "varchar(32)"},{"content", to_string(uc.get()->ran_ue_ngap_id)}},
{{"Content-ID", "amf_ue_ngap_id"},{"Content-Type", "varchar(32)"},{"content", to_string(uc.get()->amf_ue_ngap_id)}},
{{"Content-ID", "rrc_estb_cause"},{"Content-Type", "varchar(32)"},{"content",to_string(uc.get()->rrc_estb_cause)}},
{{"Content-ID", "isUeContextRequest"},{"Content-Type", "varchar(32)"},{"content", to_string(uc.get()->isUeContextRequest)}}
});
udsf_ue_context["blocks"].push_back(cgi);
udsf_ue_context["blocks"].push_back(tai);
std::string json_part = udsf_ue_context.dump();
//nlohmann::json udsf_response;
amf_n2_inst->curl_http_client_udsf(udsf_url,json_part,"PUT",udsf_response);
#if 0
// 1. generate amf_ue_ngap_id
// 2. establish ue_context associated with amf_ue_ngap_id
// 3. store ue-reated core information
......@@ -437,6 +536,7 @@ void amf_app::handle_itti_message(
i->get_msg_name());
}
}
#endif
}
// SMF Client response handlers
......
......@@ -578,6 +578,8 @@ void amf_n2::handle_itti_message(itti_initial_ue_message& init_ue_msg) {
// check the gNB context on which this UE is attached with assoc_id
itti_nas_signalling_establishment_request* itti_msg =
new itti_nas_signalling_establishment_request(TASK_AMF_N2, TASK_AMF_APP);
#if 0
//get gnb_context from udsf.200 ok gnb_context is exist
std::shared_ptr<gnb_context> gc = std::shared_ptr<gnb_context>(new gnb_context());
nlohmann::json udsf_response;
......@@ -592,16 +594,19 @@ void amf_n2::handle_itti_message(itti_initial_ue_message& init_ue_msg) {
}
Logger::amf_n2().debug("udsf_response: %s", udsf_response.dump().c_str());
gc.get()->gnb_context_from_json(udsf_response);
#endif
// gc = std::shared_ptr<gnb_context>(gc1);
// if (!is_assoc_id_2_gnb_context(init_ue_msg.assoc_id)) {
// Logger::amf_n2().error(
// "No existing gNG context with assoc_id (%d)", init_ue_msg.assoc_id);
// return;
// }
// try to get gnb_contexti
Logger::amf_n2().debug("try to get gnb_context in amf_n2.cpp");
std::shared_ptr<gnb_context> gc;
if (!is_assoc_id_2_gnb_context(init_ue_msg.assoc_id)) {
Logger::amf_n2().error(
"No existing gNG context with assoc_id (%d)", init_ue_msg.assoc_id);
return;
}
// gc = assoc_id_2_gnb_context(init_ue_msg.assoc_id);
gc = assoc_id_2_gnb_context(init_ue_msg.assoc_id);
if (gc.get()->ng_state == NGAP_RESETING ||
gc.get()->ng_state == NGAP_SHUTDOWN) {
Logger::amf_n2().warn(
......@@ -614,14 +619,20 @@ void amf_n2::handle_itti_message(itti_initial_ue_message& init_ue_msg) {
return;
}
// UE NGAP Context
// try to get IEs
Logger::amf_n2().debug("try to get IEs in amf_n2.cpp");
// parse ran_ue_ngap_id from INITIAL_UE_MESSAGE
Logger::amf_n2().debug("try to parse ran_ue_ngap_id from INITIAL_UE_MESSAGE in amf_n2.cpp");
uint32_t ran_ue_ngap_id;
if ((ran_ue_ngap_id = init_ue_msg.initUeMsg->getRanUENgapID()) == -1) {
Logger::amf_n2().error("Missing Mandatory IE (RanUeNgapId)");
return;
}else{
itti_msg->ran_ue_ngap_id = ran_ue_ngap_id;
}
std::shared_ptr<nas_context> nc = std::shared_ptr<nas_context>(new nas_context());
std::string _5g_s_tmsi;
// parse nas-pdu from INITIAL_UE_MESSAGEss
Logger::amf_n2().debug("try to parse nas-pdu from INITIAL_UE_MESSAGE in amf_n2.cpp");
uint8_t* nas_buf;
size_t nas_len = 0;
if (init_ue_msg.initUeMsg->getNasPdu(nas_buf, nas_len)) {
......@@ -631,8 +642,126 @@ void amf_n2::handle_itti_message(itti_initial_ue_message& init_ue_msg) {
Logger::amf_n2().error("Missing IE NAS-PDU");
return;
}
// parse location information from INITIAL_UE_MESSAGE
Logger::amf_n2().debug("try to parse location infromation from INITIAL_UE_MESSAGE in amf_n2.cpp");
Tai_t tai;
NrCgi_t cgi;
init_ue_msg.initUeMsg->getUserLocationInfoNR(cgi, tai);
// parse rrc_establishment from INITIAL_UE_MESSAGE
Logger::amf_n2().debug("try to parse rrc_establiehment from INITIAL_UE_MESSAGE in amf_n2.cpp");
if (init_ue_msg.initUeMsg->getRRCEstablishmentCause() == -1) {
Logger::amf_n2().warn("IE RRCEstablishmentCause not present");
itti_msg->rrc_cause = -1; // not present
} else {
itti_msg->rrc_cause = init_ue_msg.initUeMsg->getRRCEstablishmentCause();
}
// parse 5g-s-tmsi from INITIAL_UE_MESSAGE
Logger::amf_n2().debug("try to parse 5g-s-tmsi from INITIAL_UE_MESSAGE in amf_n2.cpp");
std::string _5g_s_tmsi;
if (!init_ue_msg.initUeMsg->get5GS_TMSI(_5g_s_tmsi)) {
itti_msg->is_5g_s_tmsi_present = false;
Logger::amf_n2().debug("5g_s_tmsi not present");
itti_msg->amf_ue_ngap_id = -1;
}else{
itti_msg->is_5g_s_tmsi_present = true;
itti_msg->_5g_s_tmsi = _5g_s_tmsi;
}
//check if ue_ngap_context is to be establishetd a new one
Logger::amf_n2().debug("check if ue_ngap_context is to be establishetd a new one in amf_n2.cpp");
bool is_ran_ue_ngap_id_new = true;
std::shared_ptr<nas_context> nc;
if(itti_msg->is_5g_s_tmsi_present){
//try to get nas_context using guti
std::string guti;
guti = tai.mcc + tai.mnc + amf_cfg.guami.regionID + itti_msg->_5g_s_tmsi ;
Logger::amf_app().debug("Receiving GUTI %s", guti.c_str());
if(amf_n1_inst->is_guti_2_nas_context_in_udsf(guti)){
nlohmann::json udsf_response;
std::string record_id_nas = "guti=\'" + guti + "\'";
std::string udsf_url = "http://10.103.239.53:7123/nudsf-dr/v1/amfdata/"+ std::string("nas_context/records/") + record_id_nas;
if(!amf_n2_inst->curl_http_client_udsf(udsf_url,"","GET",udsf_response)){
Logger::amf_n1().error("No existing nas_context with GUTI %s",guti.c_str());
}else if(udsf_response.dump().length()<8){
Logger::amf_n1().error("No existing nas_context with GUTI %s ...",guti.c_str());
}else{
nc = std::shared_ptr<nas_context>(new nas_context());
nc.get()->nas_context_from_json(udsf_response);
is_ran_ue_ngap_id_new = false;
itti_msg->amf_ue_ngap_id = nc.get()->amf_ue_ngap_id;
itti_msg->ran_ue_ngap_id = nc.get()->ran_ue_ngap_id;
}
}
}
// try to get a ue_ngap_context using (new/old) ran_ue_ngap_id
Logger::amf_n2().debug("try to get a ue_ngap_context using (new/old) ran_ue_ngap_id in amf_n2.cpp");
std::shared_ptr<ue_ngap_context> unc = std::shared_ptr<ue_ngap_context>(new ue_ngap_context());
nlohmann::json udsf_response;
std::string record_id, udsf_url;
if(is_ran_ue_ngap_id_new){
record_id = "RECORD_ID=\'" +std::to_string(ran_ue_ngap_id) + "\'";
}else{
record_id = "RECORD_ID=\'" +std::to_string(nc.get()->ran_ue_ngap_id) + "\'";
}
udsf_url = "http://10.103.239.53:7123/nudsf-dr/v1/amfdata/" + std::string("ue_ngap_context/records/") + record_id ;
if(!amf_n2_inst->curl_http_client_udsf(udsf_url,"","GET",udsf_response)){
Logger::amf_n2().error("No existing ue_ngap context with ran_ue_ngap_id ...");
}else if(udsf_response.dump().length()<8){
Logger::amf_n2().error("No existing ue_ngap context with ran_ue_ngap_id .....");
}else{
Logger::amf_n2().debug("udsf_response: %s", udsf_response.dump().c_str());
unc.get()->ue_ngap_context_from_json(udsf_response);
}
set_ran_ue_ngap_id_2_ue_ngap_context(ran_ue_ngap_id, unc);
// Update ue_ngap_context
unc.get()->ran_ue_ngap_id = ran_ue_ngap_id;
unc.get()->sctp_stream_recv = init_ue_msg.stream;
unc.get()->sctp_stream_send == gc.get()->next_sctp_stream;
gc.get()->next_sctp_stream += 1;
if (gc.get()->next_sctp_stream >= gc.get()->instreams)
gc.get()->next_sctp_stream = 1;
unc.get()->gnb_assoc_id = init_ue_msg.assoc_id;
// Send ue_ngap_context to UDSF
Logger::amf_n2().debug("update ue_ngap_context to UDSF amf_n2.cpp");
nlohmann::json udsf_ue_ngap_context;
std::string udsf_put_url = "";
int old_ran_ue_ngap_id = 0;
if(is_ran_ue_ngap_id_new)
old_ran_ue_ngap_id = ran_ue_ngap_id;
else
old_ran_ue_ngap_id = nc.get()->ran_ue_ngap_id;
udsf_put_url = "http://10.103.239.53:7123/nudsf-dr/v1/amfdata/" + std::string("ue_ngap_context/records/") + to_string(old_ran_ue_ngap_id);
udsf_ue_ngap_context["meta"] ["tags"] = {
{"RECORD_ID",nlohmann::json::array({to_string(old_ran_ue_ngap_id)})},
{"from_nf_ID",nlohmann::json::array({"AMF_1234"})}
} ;
udsf_ue_ngap_context["blocks"] = nlohmann::json::array({
{{"Content-ID", "ran_ue_ngap_id"},{"Content-Type", "varchar(32)"},{"content", to_string(unc.get()->ran_ue_ngap_id)}},
{{"Content-ID", "amf_ue_ngap_id"},{"Content-Type", "varchar(32)"},{"content", ""}},
{{"Content-ID", "sctp_stream_recv"},{"Content-Type", "varchar(32)"},{"content",to_string(unc.get()->sctp_stream_recv)}},
{{"Content-ID", "sctp_stream_send"},{"Content-Type", "varchar(32)"},{"content", to_string(unc.get()->sctp_stream_send)}},
{{"Content-ID", "gnb_assoc_id"},{"Content-Type", "varchar(32)"},{"content", to_string(unc.get()->gnb_assoc_id)}},
{{"Content-ID", "s_tmsi_5g"},{"Content-Type", "varchar(32)"},{"content", ""}},
{{"Content-ID", "ng_ue_state"},{"Content-Type", "varchar(32)"},{"content", ""}},
{{"Content-ID", "ueContextRequest"},{"Content-Type", "varchar(32)"},{"content", ""}}
});
std::string json_part = udsf_ue_ngap_context.dump();
amf_n2_inst->curl_http_client_udsf(udsf_put_url,json_part,"PUT",udsf_response);
// Send itti_nas_signalling_establishment_request
Logger::amf_n2().debug("Send itti_nas_signalling_establishment_request to TASK_AMF_APP amf_n2.cpp");
std::shared_ptr<itti_nas_signalling_establishment_request> i =
std::shared_ptr<itti_nas_signalling_establishment_request>(itti_msg);
int ret = itti_inst->send_msg(i);
if (0 != ret) {
Logger::amf_n2().error(
"Could not send ITTI message %s to task TASK_AMF_APP",
i->get_msg_name());
}
# if 0
if (!init_ue_msg.initUeMsg->get5GS_TMSI(_5g_s_tmsi)) {
itti_msg->is_5g_s_tmsi_present = false;
Logger::amf_n2().debug("5g_s_tmsi not present");
......@@ -735,7 +864,7 @@ void amf_n2::handle_itti_message(itti_initial_ue_message& init_ue_msg) {
}
}
std::shared_ptr<ue_ngap_context> unc;
//std::shared_ptr<ue_ngap_context> unc;
if (!is_ran_ue_id_2_ue_ngap_context(ran_ue_ngap_id)) {
Logger::amf_n2().debug(
......@@ -942,6 +1071,8 @@ void amf_n2::handle_itti_message(itti_initial_ue_message& init_ue_msg) {
"Could not send ITTI message %s to task TASK_AMF_APP",
i->get_msg_name());
}
#endif
}
//------------------------------------------------------------------------------
......
......@@ -60,6 +60,7 @@ void IndividualSubscriptionDocumentApiImpl::gnb_message_from_plugin(const std::u
printf("%s\n,length %d",bdata(payload),blength(payload));
// try to get gnb_context from UDSF
printf("try to get gnb_context from UDSF in IndividualSubscriptionDocumentApiImpl.cpp \n");
bool is_gnb_context_present = false;
std::shared_ptr<gnb_context> gc = std::shared_ptr<gnb_context>(new gnb_context());
amf_n2_inst->set_assoc_id_2_gnb_context(assoc_id, gc);
......
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