Commit 6d2446b7 authored by Tien-Thinh Nguyen's avatar Tien-Thinh Nguyen

Merge branch 'fix_ul_nas_transport' into 'develop'

Fix ul nas transport

See merge request oai/cn5g/oai-cn5g-amf!167
parents dfd73d84 631f62cd
......@@ -523,7 +523,7 @@ void amf_n1::handle_itti_message(itti_uplink_nas_data_ind& nas_data_ind) {
type, nc, nas_data_ind.ran_ue_ngap_id, nas_data_ind.amf_ue_ngap_id,
decoded_plain_msg, snn, ulCount);
} else {
Logger::amf_n1().debug("Received uplink NAS message...");
Logger::amf_n1().debug("Received Uplink NAS message...");
uplink_nas_msg_handle(
nas_data_ind.ran_ue_ngap_id, nas_data_ind.amf_ue_ngap_id,
decoded_plain_msg, plmn);
......@@ -3234,80 +3234,123 @@ void amf_n1::ul_nas_transport_handle(
uint8_t pdu_session_id = ul_nas->getPduSessionId();
uint8_t request_type = ul_nas->getRequestType();
// SNSSAI
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!");
bstring sm_msg = nullptr;
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;
if (((request_type & 0x07) == PDU_SESSION_INITIAL_REQUEST) or
((request_type & 0x07) == EXISTING_PDU_SESSION)) {
// SNSSAI
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 (!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
// 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(
"S_NSSAI for this PDU Session %s", snssai.ToString().c_str());
bstring dnn = bfromcstr("default");
if (!ul_nas->getDnn(dnn)) {
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;
"No DNN available in ULNASTransport, use default DNN!");
// TODO: use default DNN for the corresponding NSSAI
}
comUt::print_buffer(
"amf_n1", "Decoded DNN Bit String", (uint8_t*) bdata(dnn),
blength(dnn));
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 {
dnn = bfromcstr("default");
}
comUt::print_buffer(
"amf_n1", "Decoded DNN Bit String", (uint8_t*) bdata(dnn), blength(dnn));
switch (payload_type) {
case N1_SM_INFORMATION: {
if (!ul_nas->getPayloadContainer(sm_msg)) {
Logger::amf_n1().error("Cannot decode Payload Container");
return;
}
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());
}
std::shared_ptr<itti_nsmf_pdusession_update_sm_context> itti_msg =
std::make_shared<itti_nsmf_pdusession_update_sm_context>(
TASK_AMF_N1, TASK_AMF_SBI);
} 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");
}
}
}
}
......
......@@ -700,7 +700,7 @@ void amf_n2::handle_itti_message(itti_initial_ue_message& init_ue_msg) {
//------------------------------------------------------------------------------
void amf_n2::handle_itti_message(itti_ul_nas_transport& ul_nas_transport) {
Logger::amf_n2().debug("Handle UL NAS Transport...");
Logger::amf_n2().debug("Handle Uplink NAS Transport...");
unsigned long amf_ue_ngap_id = ul_nas_transport.ulNas->getAmfUeNgapId();
uint32_t ran_ue_ngap_id = ul_nas_transport.ulNas->getRanUeNgapId();
......
......@@ -82,7 +82,7 @@ class amf_n2 : public ngap::ngap_app {
void handle_itti_message(itti_initial_ue_message& init_ue_msg);
/*
* Handle ITTI message (ULNASTransport)
* Handle ITTI message (UplinkNASTransport)
* @param [itti_ul_nas_transport&]: ITTI message
* @return void
*/
......
......@@ -241,8 +241,16 @@ void amf_sbi::handle_itti_message(
Logger::amf_sbi().debug("SMF URI: %s", remote_uri.c_str());
std::string n1sm_msg = {};
std::string n2sm_msg = {};
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) {
pdu_session_update_request["n2SmInfoType"] = itti_msg.n2sm_info_type;
pdu_session_update_request["n2SmInfo"]["contentId"] = "n2msg";
......@@ -270,7 +278,7 @@ void amf_sbi::handle_itti_message(
if (amf_cfg.support_features.use_http2) http_version = 2;
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);
}
......@@ -400,6 +408,7 @@ void amf_sbi::handle_itti_message(itti_nsmf_pdusession_create_sm_context& smf) {
// TODO:
} break;
default: {
// TODO: should be removed
// send Nsmf_PDUSession_UpdateSM_Context to SMF e.g., for PDU Session
// release request
send_pdu_session_update_sm_context_request(supi, psc, smf.sm_msg, dnn);
......
......@@ -423,8 +423,8 @@ void conv::string_2_octet_string(
// o_str.buf = strcpy(new char[str.length() + 1], str.c_str());
// memcpy(o_str.buf, str.c_str(), str.size());
std::copy(str.begin(), str.end(), o_str.buf);
o_str.buf[str.length()] = '\0';
o_str.size = str.length() + 1;
o_str.size = str.length();
o_str.buf[str.length()] = '\0'; // just in case
}
//------------------------------------------------------------------------------
......
......@@ -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) {
supi = {};
pdu_session_id = 0;
n1sm = nullptr;
is_n1sm_set = false;
n2sm = nullptr;
is_n2sm_set = false;
n2sm_info_type = {};
......@@ -138,6 +140,8 @@ class itti_nsmf_pdusession_update_sm_context : public itti_msg_n11 {
: itti_msg_n11(i) {
supi = i.supi;
pdu_session_id = i.pdu_session_id;
n1sm = i.n1sm;
is_n1sm_set = i.is_n1sm_set;
n2sm = i.n2sm;
is_n2sm_set = i.is_n2sm_set;
n2sm_info_type = i.n2sm_info_type;
......@@ -150,6 +154,8 @@ class itti_nsmf_pdusession_update_sm_context : public itti_msg_n11 {
public:
std::string supi;
uint8_t pdu_session_id;
bstring n1sm;
bool is_n1sm_set;
bstring n2sm;
bool is_n2sm_set;
std::string n2sm_info_type;
......
......@@ -71,15 +71,26 @@ int Rejected_NSSAI::encode2buffer(uint8_t* buf, int len) {
if (_iei) {
ENCODE_U8(buf + encoded_size, _iei, encoded_size);
}
// Skip Length for now
uint8_t len_pos = encoded_size;
encoded_size++;
uint8_t payload_len = 0;
for (auto n : rejected_nssais) {
int size = n.encode2buffer(buf + encoded_size, len - encoded_size);
if (size > -1) {
encoded_size += size;
payload_len += size;
} else {
return -1;
}
}
// Length
uint8_t encoded_size_length = 0;
ENCODE_U8(buf + len_pos, payload_len, encoded_size_length);
Logger::nas_mm().debug("Encoded Rejected_NSSAI (len %d)", encoded_size);
return encoded_size;
}
......
......@@ -70,7 +70,7 @@ uint8_t Rejected_SNSSAI::getSST() {
//------------------------------------------------------------------------------
void Rejected_SNSSAI::setSd(const uint32_t& sd) {
sd_ = std::optional<uint32_t>(sd);
sd_.emplace(sd);
length_ += 3;
}
......@@ -123,8 +123,10 @@ int Rejected_SNSSAI::encode2buffer(uint8_t* buf, int len) {
octet = (length_ << 4) | (0x0f & cause_);
ENCODE_U8(buf + encoded_size, octet, encoded_size);
ENCODE_U8(buf + encoded_size, sst_, encoded_size);
Logger::nas_mm().debug("SST %d", sst_);
if (sd_.has_value()) {
ENCODE_U24(buf + encoded_size, sd_.value(), encoded_size);
Logger::nas_mm().debug("SD 0x%x", sd_.value());
}
Logger::nas_mm().debug("Encoded Rejected_SNSSAI (len %d)", encoded_size);
return encoded_size;
......
......@@ -432,7 +432,6 @@ int ngap_amf_handle_pdu_session_resource_setup_response(
itti_msg->n2sm = blk2bstr(
list[0].pduSessionResourceSetupResponseTransfer.buf,
list[0].pduSessionResourceSetupResponseTransfer.size);
;
itti_msg->is_n2sm_set = true;
itti_msg->n2sm_info_type = "PDU_RES_SETUP_RSP";
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