Commit 5a1c9b65 authored by Tien Thinh NGUYEN's avatar Tien Thinh NGUYEN

Update ULNasTransport

parent dfd73d84
...@@ -3234,80 +3234,123 @@ void amf_n1::ul_nas_transport_handle( ...@@ -3234,80 +3234,123 @@ void amf_n1::ul_nas_transport_handle(
uint8_t pdu_session_id = ul_nas->getPduSessionId(); uint8_t pdu_session_id = ul_nas->getPduSessionId();
uint8_t request_type = ul_nas->getRequestType(); uint8_t request_type = ul_nas->getRequestType();
// SNSSAI bstring sm_msg = nullptr;
SNSSAI_t snssai = {};
if (!ul_nas->getSnssai(snssai)) { // If no SNSSAI in this message, use the
// one in Registration Request
Logger::amf_n1().debug(
"No Requested NSSAI available in ULNASTransport, use NSSAI from "
"Requested/Configured NSSAI!");
std::shared_ptr<nas_context> nc = {}; if (((request_type & 0x07) == PDU_SESSION_INITIAL_REQUEST) or
if (!amf_n1_inst->is_amf_ue_id_2_nas_context(amf_ue_ngap_id, nc)) { ((request_type & 0x07) == EXISTING_PDU_SESSION)) {
Logger::amf_n1().warn( // SNSSAI
"No existed nas_context with amf_ue_ngap_id(0x%x)", amf_ue_ngap_id); SNSSAI_t snssai = {};
return; if (!ul_nas->getSnssai(snssai)) { // If no SNSSAI in this message, use the
// one in Registration Request
Logger::amf_n1().debug(
"No Requested NSSAI available in ULNASTransport, use NSSAI from "
"Requested/Configured NSSAI!");
std::shared_ptr<nas_context> nc = {};
if (!amf_n1_inst->is_amf_ue_id_2_nas_context(amf_ue_ngap_id, nc)) {
Logger::amf_n1().warn(
"No existed nas_context with amf_ue_ngap_id(0x%x)", amf_ue_ngap_id);
return;
}
// TODO: Only use the first one for now if there's multiple requested
// NSSAI since we don't know which slice associated with this PDU session
if (nc->requestedNssai.size() > 0) {
snssai = nc->requestedNssai[0];
Logger::amf_n1().debug(
"Use first Requested S-NSSAI %s", snssai.ToString().c_str());
} else {
// Otherwise, use first default subscribed S-NSSAI if available
for (const auto& sn : nc->subscribed_snssai) {
if (sn.first) {
snssai = sn.second;
Logger::amf_n1().debug(
"Use Default Configured S-NSSAI %s", snssai.ToString().c_str());
break;
}
}
}
} }
// TODO: Only use the first one for now if there's multiple requested NSSAI Logger::amf_n1().debug(
// since we don't know which slice associated with this PDU session "S_NSSAI for this PDU Session %s", snssai.ToString().c_str());
if (nc->requestedNssai.size() > 0) {
snssai = nc->requestedNssai[0]; bstring dnn = bfromcstr("default");
if (!ul_nas->getDnn(dnn)) {
Logger::amf_n1().debug( Logger::amf_n1().debug(
"Use first Requested S-NSSAI %s", snssai.ToString().c_str()); "No DNN available in ULNASTransport, use default DNN!");
} else { // TODO: use default DNN for the corresponding NSSAI
// Otherwise, use first default subscribed S-NSSAI if available }
for (const auto& sn : nc->subscribed_snssai) {
if (sn.first) { comUt::print_buffer(
snssai = sn.second; "amf_n1", "Decoded DNN Bit String", (uint8_t*) bdata(dnn),
Logger::amf_n1().debug( blength(dnn));
"Use Default Configured S-NSSAI %s", snssai.ToString().c_str());
break; switch (payload_type) {
case N1_SM_INFORMATION: {
if (!ul_nas->getPayloadContainer(sm_msg)) {
Logger::amf_n1().error("Cannot decode Payload Container");
return;
}
std::shared_ptr<itti_nsmf_pdusession_create_sm_context> itti_msg =
std::make_shared<itti_nsmf_pdusession_create_sm_context>(
TASK_AMF_N1, TASK_AMF_SBI);
itti_msg->ran_ue_ngap_id = ran_ue_ngap_id;
itti_msg->amf_ue_ngap_id = amf_ue_ngap_id;
itti_msg->req_type = request_type;
itti_msg->pdu_sess_id = pdu_session_id;
itti_msg->dnn = bstrcpy(dnn);
itti_msg->sm_msg = bstrcpy(sm_msg);
itti_msg->snssai.sST = snssai.sst;
itti_msg->snssai.sD = std::to_string(snssai.sd);
itti_msg->plmn.mnc = plmn.mnc;
itti_msg->plmn.mcc = plmn.mcc;
int ret = itti_inst->send_msg(itti_msg);
if (0 != ret) {
Logger::amf_n1().error(
"Could not send ITTI message %s to task TASK_AMF_SBI",
itti_msg->get_msg_name());
} }
} break;
default: {
Logger::amf_n1().debug("Transport message un supported");
} }
} }
}
Logger::amf_n1().debug(
"S_NSSAI for this PDU Session %s", snssai.ToString().c_str());
bstring dnn = bfromcstr("default");
bstring sm_msg = nullptr;
if (ul_nas->getDnn(dnn)) {
} else { } else {
dnn = bfromcstr("default"); switch (payload_type) {
} case N1_SM_INFORMATION: {
comUt::print_buffer( if (!ul_nas->getPayloadContainer(sm_msg)) {
"amf_n1", "Decoded DNN Bit String", (uint8_t*) bdata(dnn), blength(dnn)); Logger::amf_n1().error("Cannot decode Payload Container");
switch (payload_type) { return;
case N1_SM_INFORMATION: { }
if (!ul_nas->getPayloadContainer(sm_msg)) {
Logger::amf_n1().error("Cannot decode Payload Container");
return;
}
std::shared_ptr<itti_nsmf_pdusession_create_sm_context> itti_msg = std::shared_ptr<itti_nsmf_pdusession_update_sm_context> itti_msg =
std::make_shared<itti_nsmf_pdusession_create_sm_context>( std::make_shared<itti_nsmf_pdusession_update_sm_context>(
TASK_AMF_N1, TASK_AMF_SBI); TASK_AMF_N1, TASK_AMF_SBI);
itti_msg->ran_ue_ngap_id = ran_ue_ngap_id;
itti_msg->amf_ue_ngap_id = amf_ue_ngap_id;
itti_msg->req_type = request_type;
itti_msg->pdu_sess_id = pdu_session_id;
itti_msg->dnn = bstrcpy(dnn);
itti_msg->sm_msg = bstrcpy(sm_msg);
itti_msg->snssai.sST = snssai.sst;
itti_msg->snssai.sD = std::to_string(snssai.sd);
itti_msg->plmn.mnc = plmn.mnc;
itti_msg->plmn.mcc = plmn.mcc;
int ret = itti_inst->send_msg(itti_msg);
if (0 != ret) {
Logger::amf_n1().error(
"Could not send ITTI message %s to task TASK_AMF_SBI",
itti_msg->get_msg_name());
}
} break; itti_msg->ran_ue_ngap_id = ran_ue_ngap_id;
itti_msg->amf_ue_ngap_id = amf_ue_ngap_id;
itti_msg->pdu_session_id = pdu_session_id;
itti_msg->n1sm = bstrcpy(sm_msg);
itti_msg->is_n1sm_set = true;
int ret = itti_inst->send_msg(itti_msg);
if (0 != ret) {
Logger::amf_n1().error(
"Could not send ITTI message %s to task TASK_AMF_SBI",
itti_msg->get_msg_name());
}
} break;
default: {
Logger::amf_n1().debug("Transport message is not supported");
}
}
} }
} }
......
...@@ -241,8 +241,16 @@ void amf_sbi::handle_itti_message( ...@@ -241,8 +241,16 @@ void amf_sbi::handle_itti_message(
Logger::amf_sbi().debug("SMF URI: %s", remote_uri.c_str()); Logger::amf_sbi().debug("SMF URI: %s", remote_uri.c_str());
std::string n1sm_msg = {};
std::string n2sm_msg = {}; std::string n2sm_msg = {};
nlohmann::json pdu_session_update_request = {}; nlohmann::json pdu_session_update_request = {};
if (itti_msg.is_n1sm_set) {
pdu_session_update_request["n1SmMsg"]["contentId"] = "n1SmMsg";
octet_stream_2_hex_stream(
(uint8_t*) bdata(itti_msg.n1sm), blength(itti_msg.n1sm), n1sm_msg);
}
if (itti_msg.is_n2sm_set) { if (itti_msg.is_n2sm_set) {
pdu_session_update_request["n2SmInfoType"] = itti_msg.n2sm_info_type; pdu_session_update_request["n2SmInfoType"] = itti_msg.n2sm_info_type;
pdu_session_update_request["n2SmInfo"]["contentId"] = "n2msg"; pdu_session_update_request["n2SmInfo"]["contentId"] = "n2msg";
...@@ -270,7 +278,7 @@ void amf_sbi::handle_itti_message( ...@@ -270,7 +278,7 @@ void amf_sbi::handle_itti_message(
if (amf_cfg.support_features.use_http2) http_version = 2; if (amf_cfg.support_features.use_http2) http_version = 2;
curl_http_client( curl_http_client(
remote_uri, json_part, "", n2sm_msg, supi, itti_msg.pdu_session_id, remote_uri, json_part, n1sm_msg, n2sm_msg, supi, itti_msg.pdu_session_id,
http_version, itti_msg.promise_id); http_version, itti_msg.promise_id);
} }
......
...@@ -124,6 +124,8 @@ class itti_nsmf_pdusession_update_sm_context : public itti_msg_n11 { ...@@ -124,6 +124,8 @@ class itti_nsmf_pdusession_update_sm_context : public itti_msg_n11 {
: itti_msg_n11(NSMF_PDU_SESSION_UPDATE_SM_CTX, origin, destination) { : itti_msg_n11(NSMF_PDU_SESSION_UPDATE_SM_CTX, origin, destination) {
supi = {}; supi = {};
pdu_session_id = 0; pdu_session_id = 0;
n1sm = nullptr;
is_n1sm_set = false;
n2sm = nullptr; n2sm = nullptr;
is_n2sm_set = false; is_n2sm_set = false;
n2sm_info_type = {}; n2sm_info_type = {};
...@@ -138,6 +140,8 @@ class itti_nsmf_pdusession_update_sm_context : public itti_msg_n11 { ...@@ -138,6 +140,8 @@ class itti_nsmf_pdusession_update_sm_context : public itti_msg_n11 {
: itti_msg_n11(i) { : itti_msg_n11(i) {
supi = i.supi; supi = i.supi;
pdu_session_id = i.pdu_session_id; pdu_session_id = i.pdu_session_id;
n1sm = i.n1sm;
is_n1sm_set = i.is_n1sm_set;
n2sm = i.n2sm; n2sm = i.n2sm;
is_n2sm_set = i.is_n2sm_set; is_n2sm_set = i.is_n2sm_set;
n2sm_info_type = i.n2sm_info_type; n2sm_info_type = i.n2sm_info_type;
...@@ -150,6 +154,8 @@ class itti_nsmf_pdusession_update_sm_context : public itti_msg_n11 { ...@@ -150,6 +154,8 @@ class itti_nsmf_pdusession_update_sm_context : public itti_msg_n11 {
public: public:
std::string supi; std::string supi;
uint8_t pdu_session_id; uint8_t pdu_session_id;
bstring n1sm;
bool is_n1sm_set;
bstring n2sm; bstring n2sm;
bool is_n2sm_set; bool is_n2sm_set;
std::string n2sm_info_type; std::string n2sm_info_type;
......
...@@ -432,7 +432,6 @@ int ngap_amf_handle_pdu_session_resource_setup_response( ...@@ -432,7 +432,6 @@ int ngap_amf_handle_pdu_session_resource_setup_response(
itti_msg->n2sm = blk2bstr( itti_msg->n2sm = blk2bstr(
list[0].pduSessionResourceSetupResponseTransfer.buf, list[0].pduSessionResourceSetupResponseTransfer.buf,
list[0].pduSessionResourceSetupResponseTransfer.size); list[0].pduSessionResourceSetupResponseTransfer.size);
;
itti_msg->is_n2sm_set = true; itti_msg->is_n2sm_set = true;
itti_msg->n2sm_info_type = "PDU_RES_SETUP_RSP"; itti_msg->n2sm_info_type = "PDU_RES_SETUP_RSP";
itti_msg->amf_ue_ngap_id = itti_msg->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