Commit 7317ea9e authored by Tien Thinh NGUYEN's avatar Tien Thinh NGUYEN

Code cleanup for UL NAS Transfport

parent 15a1a93e
......@@ -3263,7 +3263,8 @@ void amf_n1::ul_nas_transport_handle(
auto ul_nas = std::make_unique<ULNASTransport>();
ul_nas->Decode((uint8_t*) bdata(nas), blength(nas));
uint8_t payload_type = ul_nas->GetPayloadContainerType();
uint8_t pdu_session_id = ul_nas->GetPduSessionId();
uint8_t pdu_session_id = 0;
ul_nas->GetPduSessionId(pdu_session_id);
uint8_t request_type = 0;
if (!ul_nas->GetRequestType(request_type)) {
......@@ -3314,7 +3315,7 @@ void amf_n1::ul_nas_transport_handle(
bstring dnn = bfromcstr("default");
if (!ul_nas->getDnn(dnn)) {
if (!ul_nas->GetDnn(dnn)) {
Logger::amf_n1().debug(
"No DNN available in ULNASTransport, use default DNN!");
// TODO: use default DNN for the corresponding NSSAI
......
......@@ -81,7 +81,7 @@ S_NSSAI::S_NSSAI(std::optional<uint8_t> iei, SNSSAI_s snssai) {
S_NSSAI::~S_NSSAI() {}
//------------------------------------------------------------------------------
void S_NSSAI::getValue(SNSSAI_t& snssai) {
void S_NSSAI::getValue(SNSSAI_t& snssai) const {
uint8_t len = {0};
// SST
snssai.sst = sst_;
......
......@@ -43,7 +43,7 @@ class S_NSSAI : public Type4NasIe {
int Encode(uint8_t* buf, int len);
int Decode(uint8_t* buf, int len, const bool is_option = true);
void getValue(SNSSAI_t& snssai);
void getValue(SNSSAI_t& snssai) const;
void SetSNSSAI(
std::optional<int8_t> iei, uint8_t sst, std::optional<int32_t> sd,
......
......@@ -29,8 +29,8 @@ using namespace nas;
//------------------------------------------------------------------------------
ULNASTransport::ULNASTransport()
: NasMmPlainHeader(EPD_5GS_MM_MSG, UL_NAS_TRANSPORT) {
ie_pdu_session_identity_2 = std::nullopt;
ie_old_pdu_session_identity_2 = std::nullopt;
ie_pdu_session_id = std::nullopt;
ie_old_pdu_session_id = std::nullopt;
ie_request_type = std::nullopt;
ie_s_nssai = std::nullopt;
ie_dnn = std::nullopt;
......@@ -53,52 +53,53 @@ void ULNASTransport::SetPayloadContainerType(uint8_t value) {
}
//------------------------------------------------------------------------------
uint8_t ULNASTransport::GetPayloadContainerType() {
uint8_t ULNASTransport::GetPayloadContainerType() const {
return ie_payload_container_type.GetValue();
}
//------------------------------------------------------------------------------
void ULNASTransport::SetPayloadContainer(
std::vector<PayloadContainerEntry> content) {
const std::vector<PayloadContainerEntry>& content) {
ie_payload_container.SetValue(content);
}
//------------------------------------------------------------------------------
void ULNASTransport::GetPayloadContainer(bstring& content) {
void ULNASTransport::GetPayloadContainer(bstring& content) const {
ie_payload_container.GetValue(content);
}
//------------------------------------------------------------------------------
void ULNASTransport::GetPayloadContainer(
std::vector<PayloadContainerEntry>& content) {
std::vector<PayloadContainerEntry>& content) const {
ie_payload_container.GetValue(content);
}
//------------------------------------------------------------------------------
void ULNASTransport::SetPduSessionIdentity2(uint8_t value) {
ie_pdu_session_identity_2 =
void ULNASTransport::SetPduSessionId(uint8_t value) {
ie_pdu_session_id =
std::make_optional<PduSessionIdentity2>(kIeiPduSessionId, value);
}
//------------------------------------------------------------------------------
uint8_t ULNASTransport::GetPduSessionId() {
if (ie_pdu_session_identity_2.has_value()) {
return ie_pdu_session_identity_2.value().GetValue();
bool ULNASTransport::GetPduSessionId(uint8_t& value) const {
if (ie_pdu_session_id.has_value()) {
value = ie_pdu_session_id.value().GetValue();
return true;
} else {
return -1;
return false;
}
}
//------------------------------------------------------------------------------
void ULNASTransport::SetOldPduSessionIdentity2(uint8_t value) {
ie_old_pdu_session_identity_2 =
void ULNASTransport::SetOldPduSessionId(uint8_t value) {
ie_old_pdu_session_id =
std::make_optional<PduSessionIdentity2>(kIeiOldPduSessionId, value);
}
//------------------------------------------------------------------------------
bool ULNASTransport::GetOldPduSessionId(uint8_t& value) {
if (ie_old_pdu_session_identity_2.has_value()) {
value = ie_old_pdu_session_identity_2.value().GetValue();
bool ULNASTransport::GetOldPduSessionId(uint8_t& value) const {
if (ie_old_pdu_session_id.has_value()) {
value = ie_old_pdu_session_id.value().GetValue();
return true;
} else {
return false;
......@@ -111,7 +112,7 @@ void ULNASTransport::SetRequestType(uint8_t value) {
}
//------------------------------------------------------------------------------
bool ULNASTransport::GetRequestType(uint8_t& value) {
bool ULNASTransport::GetRequestType(uint8_t& value) const {
if (ie_request_type.has_value()) {
value = ie_request_type.value().GetValue();
return true;
......@@ -121,13 +122,13 @@ bool ULNASTransport::GetRequestType(uint8_t& value) {
}
//------------------------------------------------------------------------------
void ULNASTransport::SetSNssai(SNSSAI_s snssai) {
void ULNASTransport::SetSNssai(const SNSSAI_s& snssai) {
ie_s_nssai =
std::make_optional<S_NSSAI>(std::optional<uint8_t>{kIeiSNssai}, snssai);
}
//------------------------------------------------------------------------------
bool ULNASTransport::GetSNssai(SNSSAI_s& snssai) {
bool ULNASTransport::GetSNssai(SNSSAI_s& snssai) const {
if (ie_s_nssai.has_value()) {
ie_s_nssai.value().getValue(snssai);
return true;
......@@ -137,12 +138,12 @@ bool ULNASTransport::GetSNssai(SNSSAI_s& snssai) {
}
//------------------------------------------------------------------------------
void ULNASTransport::setDNN(bstring dnn) {
void ULNASTransport::SetDnn(const bstring& dnn) {
ie_dnn = std::make_optional<DNN>(dnn);
}
//------------------------------------------------------------------------------
bool ULNASTransport::getDnn(bstring& dnn) {
bool ULNASTransport::GetDnn(bstring& dnn) const {
if (ie_dnn.has_value()) {
ie_dnn.value().GetValue(dnn);
return true;
......@@ -195,94 +196,102 @@ int ULNASTransport::Encode(uint8_t* buf, int len) {
size = ie_payload_container.Encode(
buf + encoded_size, len - encoded_size,
ie_payload_container_type.GetValue());
if (size != KEncodeDecodeError) {
encoded_size += size;
} else {
Logger::nas_mm().error("Encoding ie_payload_container error");
Logger::nas_mm().error(
"Decoding %s error", Payload_Container::GetIeName().c_str());
return KEncodeDecodeError;
}
if (!ie_pdu_session_identity_2.has_value()) {
Logger::nas_mm().warn("IE ie_pdu_session_identity_2 is not available");
if (!ie_pdu_session_id.has_value()) {
Logger::nas_mm().debug(
"IE %s is not available", PduSessionIdentity2::GetIeName().c_str());
} else {
size = ie_pdu_session_identity_2.value().Encode(
size = ie_pdu_session_id.value().Encode(
buf + encoded_size, len - encoded_size);
if (size != KEncodeDecodeError) {
encoded_size += size;
} else {
Logger::nas_mm().error("Encoding IE ie_pdu_session_identity_2 error");
Logger::nas_mm().error(
"Encoding %s error", PduSessionIdentity2::GetIeName().c_str());
return KEncodeDecodeError;
}
}
if (!ie_old_pdu_session_identity_2.has_value()) {
Logger::nas_mm().warn("IE ie_old_pdu_session_identity_2 is not available");
if (!ie_old_pdu_session_id.has_value()) {
Logger::nas_mm().debug(
"IE %s is not available", PduSessionIdentity2::GetIeName().c_str());
} else {
size = ie_old_pdu_session_identity_2.value().Encode(
size = ie_old_pdu_session_id.value().Encode(
buf + encoded_size, len - encoded_size);
if (size != KEncodeDecodeError) {
encoded_size += size;
} else {
Logger::nas_mm().error(
"Encoding IE ie_old_pdu_session_identity_2 error");
"Encoding %s error", PduSessionIdentity2::GetIeName().c_str());
return KEncodeDecodeError;
}
}
if (!ie_request_type.has_value()) {
Logger::nas_mm().warn("IE ie_request_type is not available");
Logger::nas_mm().debug(
"IE %s is not available", RequestType::GetIeName().c_str());
} else {
size =
ie_request_type.value().Encode(buf + encoded_size, len - encoded_size);
if (size != KEncodeDecodeError) {
encoded_size += size;
} else {
Logger::nas_mm().error("Encoding IE ie_request_type error");
Logger::nas_mm().error(
"Encoding %s error", RequestType::GetIeName().c_str());
return KEncodeDecodeError;
}
}
if (!ie_s_nssai.has_value()) {
Logger::nas_mm().warn("IE ie_s_nssai is not available");
Logger::nas_mm().debug(
"IE %s is not available", S_NSSAI::GetIeName().c_str());
} else {
size = ie_s_nssai.value().Encode(buf + encoded_size, len - encoded_size);
if (size != KEncodeDecodeError) {
encoded_size += size;
} else {
Logger::nas_mm().error("Encoding IE ie_s_nssai error");
Logger::nas_mm().error("Encoding %s error", S_NSSAI::GetIeName().c_str());
return KEncodeDecodeError;
}
}
if (!ie_dnn.has_value()) {
Logger::nas_mm().warn("IE ie_dnn is not available");
Logger::nas_mm().debug("IE %s is not available", DNN::GetIeName().c_str());
} else {
size = ie_dnn.value().Encode(buf + encoded_size, len - encoded_size);
if (size != KEncodeDecodeError) {
encoded_size += size;
} else {
Logger::nas_mm().error("Encoding IE ie_dnn error");
Logger::nas_mm().error("Encoding %s error", DNN::GetIeName().c_str());
return KEncodeDecodeError;
}
}
if (!ie_additional_information.has_value()) {
Logger::nas_mm().warn("IE ie_additional_information is not available");
Logger::nas_mm().debug(
"IE %s is not available", AdditionalInformation::GetIeName().c_str());
} else {
size = ie_additional_information.value().Encode(
buf + encoded_size, len - encoded_size);
if (size != KEncodeDecodeError) {
encoded_size += size;
} else {
Logger::nas_mm().error("Encoding IE ie_additional_information error");
Logger::nas_mm().error(
"Encoding %s error", AdditionalInformation::GetIeName().c_str());
return KEncodeDecodeError;
}
}
if (!ie_ma_pdu_session_information.has_value()) {
Logger::nas_mm().warn("IE ie_ma_pdu_session_information is not available");
Logger::nas_mm().debug(
"IE %s is not available", MaPduSessionInformation::GetIeName().c_str());
} else {
size = ie_ma_pdu_session_information.value().Encode(
buf + encoded_size, len - encoded_size);
......@@ -290,23 +299,24 @@ int ULNASTransport::Encode(uint8_t* buf, int len) {
encoded_size += size;
} else {
Logger::nas_mm().error(
"Encoding IE ie_ma_pdu_session_information error");
"Encoding %s error", MaPduSessionInformation::GetIeName().c_str());
return KEncodeDecodeError;
}
}
if (!ie_release_assistance_indication.has_value()) {
Logger::nas_mm().warn(
"IE ie_release_assistance_indication is not available");
Logger::nas_mm().debug(
"IE %s is not available",
ReleaseAssistanceIndication::GetIeName().c_str());
} else {
size = ie_release_assistance_indication.value().Encode(
buf + encoded_size, len - encoded_size);
if (size != KEncodeDecodeError) {
encoded_size += size;
} else {
Logger::nas_mm().error(
"Encoding IE ie_release_assistance_indication error");
"Encoding %s error",
ReleaseAssistanceIndication::GetIeName().c_str());
return KEncodeDecodeError;
}
}
......@@ -333,7 +343,11 @@ int ULNASTransport::Decode(uint8_t* buf, int len) {
// Payload Container Type
decoded_result = ie_payload_container_type.Decode(
buf + decoded_size, len - decoded_size, false);
if (decoded_result == KEncodeDecodeError) return KEncodeDecodeError;
if (decoded_result == KEncodeDecodeError) {
Logger::nas_mm().error(
"Decoding %s error", PayloadContainerType::GetIeName().c_str());
return KEncodeDecodeError;
}
decoded_size += decoded_result;
decoded_size++; // 1/2 octet for PayloadContainerType, 1/2 octet for spare
......@@ -341,11 +355,18 @@ int ULNASTransport::Decode(uint8_t* buf, int len) {
decoded_result = ie_payload_container.Decode(
buf + decoded_size, len - decoded_size, false,
ie_payload_container_type.GetValue());
if (decoded_result == KEncodeDecodeError) return KEncodeDecodeError;
if (decoded_result == KEncodeDecodeError) {
Logger::nas_mm().error(
"Decoding %s error", Payload_Container::GetIeName().c_str());
return KEncodeDecodeError;
}
decoded_size += decoded_result;
Logger::nas_mm().debug("Decoded_size (%d)", decoded_size);
uint8_t octet = *(buf + decoded_size);
// Decode other IEs
uint8_t octet = 0x00;
DECODE_U8_VALUE(buf + decoded_size, octet);
Logger::nas_mm().debug("First option IEI (0x%x)", octet);
bool flag = false;
......@@ -357,24 +378,25 @@ int ULNASTransport::Decode(uint8_t* buf, int len) {
if ((decoded_result = ie_request_type_tmp.Decode(
buf + decoded_size, len - decoded_size, true)) ==
KEncodeDecodeError)
return decoded_result;
return KEncodeDecodeError;
decoded_size += decoded_result;
ie_request_type = std::optional<RequestType>(ie_request_type_tmp);
octet = *(buf + decoded_size);
DECODE_U8_VALUE(buf + decoded_size, octet);
Logger::nas_mm().debug("Next IEI (0x%x)", octet);
} break;
case kIeiMaPduSessionInformation: {
Logger::nas_mm().debug("Decoding IEI (0xA)");
Logger::nas_mm().debug(
"Decoding IEI 0x%x", kIeiMaPduSessionInformation);
MaPduSessionInformation ie_ma_pdu_session_information_tmp = {};
if ((decoded_result = ie_ma_pdu_session_information_tmp.Decode(
buf + decoded_size, len - decoded_size, true)) ==
KEncodeDecodeError)
return decoded_result;
return KEncodeDecodeError;
decoded_size += decoded_result;
ie_ma_pdu_session_information = std::optional<MaPduSessionInformation>(
ie_ma_pdu_session_information_tmp);
octet = *(buf + decoded_size);
DECODE_U8_VALUE(buf + decoded_size, octet);
Logger::nas_mm().debug("Next IEI (0x%x)", octet);
} break;
......@@ -385,12 +407,12 @@ int ULNASTransport::Decode(uint8_t* buf, int len) {
if ((decoded_result = ie_release_assistance_indication_tmp.Decode(
buf + decoded_size, len - decoded_size, true)) ==
KEncodeDecodeError)
return decoded_result;
return KEncodeDecodeError;
decoded_size += decoded_result;
ie_release_assistance_indication =
std::optional<ReleaseAssistanceIndication>(
ie_release_assistance_indication_tmp);
octet = *(buf + decoded_size);
DECODE_U8_VALUE(buf + decoded_size, octet);
Logger::nas_mm().debug("Next IEI (0x%x)", octet);
} break;
......@@ -402,29 +424,29 @@ int ULNASTransport::Decode(uint8_t* buf, int len) {
switch (octet) {
case kIeiPduSessionId: {
Logger::nas_mm().debug("Decoding IEI 0x%x", kIeiPduSessionId);
PduSessionIdentity2 ie_pdu_session_identity_2_tmp = {};
if ((decoded_result = ie_pdu_session_identity_2_tmp.Decode(
PduSessionIdentity2 ie_pdu_session_id_tmp = {};
if ((decoded_result = ie_pdu_session_id_tmp.Decode(
buf + decoded_size, len - decoded_size, true)) ==
KEncodeDecodeError)
return decoded_result;
return KEncodeDecodeError;
decoded_size += decoded_result;
ie_pdu_session_identity_2 =
std::optional<PduSessionIdentity2>(ie_pdu_session_identity_2_tmp);
octet = *(buf + decoded_size);
ie_pdu_session_id =
std::optional<PduSessionIdentity2>(ie_pdu_session_id_tmp);
DECODE_U8_VALUE(buf + decoded_size, octet);
Logger::nas_mm().debug("Next IEI (0x%x)", octet);
} break;
case kIeiOldPduSessionId: {
Logger::nas_mm().debug("Decoding IEI 0x%x", kIeiOldPduSessionId);
PduSessionIdentity2 ie_old_pdu_session_identity_2_tmp = {};
if ((decoded_result = ie_old_pdu_session_identity_2_tmp.Decode(
PduSessionIdentity2 ie_old_pdu_session_id_tmp = {};
if ((decoded_result = ie_old_pdu_session_id_tmp.Decode(
buf + decoded_size, len - decoded_size, true)) ==
KEncodeDecodeError)
return decoded_result;
return KEncodeDecodeError;
decoded_size += decoded_result;
ie_old_pdu_session_identity_2 = std::optional<PduSessionIdentity2>(
ie_old_pdu_session_identity_2_tmp);
octet = *(buf + decoded_size);
ie_old_pdu_session_id =
std::optional<PduSessionIdentity2>(ie_old_pdu_session_id_tmp);
DECODE_U8_VALUE(buf + decoded_size, octet);
Logger::nas_mm().debug("Next IEI (0x%x)", octet);
} break;
......@@ -435,10 +457,10 @@ int ULNASTransport::Decode(uint8_t* buf, int len) {
if ((decoded_result = ie_s_nssai_tmp.Decode(
buf + decoded_size, len - decoded_size, kIeIsOptional)) ==
KEncodeDecodeError)
return decoded_result;
return KEncodeDecodeError;
decoded_size += decoded_result;
ie_s_nssai = std::optional<S_NSSAI>(ie_s_nssai_tmp);
octet = *(buf + decoded_size);
DECODE_U8_VALUE(buf + decoded_size, octet);
Logger::nas_mm().debug("Next IEI (0x%x)", octet);
} break;
......@@ -448,11 +470,10 @@ int ULNASTransport::Decode(uint8_t* buf, int len) {
if ((decoded_result = ie_dnn_tmp.Decode(
buf + decoded_size, len - decoded_size, true)) ==
KEncodeDecodeError)
return decoded_result;
return KEncodeDecodeError;
decoded_size += decoded_result;
ie_dnn = std::optional<DNN>(ie_dnn_tmp);
octet = *(buf + decoded_size);
DECODE_U8_VALUE(buf + decoded_size, octet);
Logger::nas_mm().debug("Next IEI (0x%x)", octet);
} break;
......@@ -462,11 +483,11 @@ int ULNASTransport::Decode(uint8_t* buf, int len) {
if ((decoded_result = ie_additional_information_tmp.Decode(
buf + decoded_size, len - decoded_size, true)) ==
KEncodeDecodeError)
return decoded_result;
return KEncodeDecodeError;
decoded_size += decoded_result;
ie_additional_information =
std::optional<AdditionalInformation>(ie_additional_information_tmp);
octet = *(buf + decoded_size);
DECODE_U8_VALUE(buf + decoded_size, octet);
Logger::nas_mm().debug("Next IEI (0x%x)", octet);
} break;
......@@ -483,6 +504,6 @@ int ULNASTransport::Decode(uint8_t* buf, int len) {
}
Logger::nas_mm().debug(
"Decoded ULNASTransport message len(%d)", decoded_size);
"Decoded ULNASTransport message len (%d)", decoded_size);
return decoded_size;
}
......@@ -37,43 +37,46 @@ class ULNASTransport : public NasMmPlainHeader {
int Decode(uint8_t* buf, int len);
void SetPayloadContainerType(uint8_t value);
uint8_t GetPayloadContainerType();
uint8_t GetPayloadContainerType() const;
void SetPayloadContainer(std::vector<PayloadContainerEntry> content);
void GetPayloadContainer(std::vector<PayloadContainerEntry>& content);
void GetPayloadContainer(bstring& content);
void SetPayloadContainer(const std::vector<PayloadContainerEntry>& content);
void GetPayloadContainer(std::vector<PayloadContainerEntry>& content) const;
void GetPayloadContainer(bstring& content) const;
void SetPduSessionIdentity2(uint8_t value);
uint8_t GetPduSessionId();
void SetPduSessionId(uint8_t value);
bool GetPduSessionId(uint8_t& value) const;
void SetOldPduSessionIdentity2(uint8_t value);
bool GetOldPduSessionId(uint8_t& value);
void SetOldPduSessionId(uint8_t value);
bool GetOldPduSessionId(uint8_t& value) const;
void SetRequestType(uint8_t value);
bool GetRequestType(uint8_t& value);
bool GetRequestType(uint8_t& value) const;
void SetSNssai(SNSSAI_s snssai);
bool GetSNssai(SNSSAI_s& snssai);
void SetSNssai(const SNSSAI_s& snssai);
bool GetSNssai(SNSSAI_s& snssai) const;
void setDNN(bstring dnn);
bool getDnn(bstring& dnn);
void SetDnn(const bstring& dnn);
bool GetDnn(bstring& dnn) const;
void SetAdditionalInformation(const bstring& value);
// TODO: Get
void SetMaPduSessionInformation(uint8_t value);
// TODO: Get
void SetReleaseAssistanceIndication(uint8_t value);
// TODO: Get
public:
PayloadContainerType ie_payload_container_type; // Mandatory
Payload_Container ie_payload_container; // Mandatory
std::optional<PduSessionIdentity2> ie_pdu_session_identity_2; // Optional
std::optional<PduSessionIdentity2> ie_old_pdu_session_identity_2; // Optional
std::optional<RequestType> ie_request_type; // Optional
std::optional<S_NSSAI> ie_s_nssai; // Optional
std::optional<DNN> ie_dnn; // Optional
std::optional<AdditionalInformation> ie_additional_information; // Optional
std::optional<PduSessionIdentity2> ie_pdu_session_id; // Optional
std::optional<PduSessionIdentity2> ie_old_pdu_session_id; // Optional
std::optional<RequestType> ie_request_type; // Optional
std::optional<S_NSSAI> ie_s_nssai; // Optional
std::optional<DNN> ie_dnn; // Optional
std::optional<AdditionalInformation> ie_additional_information; // Optional
std::optional<MaPduSessionInformation>
ie_ma_pdu_session_information; // Optional
std::optional<ReleaseAssistanceIndication>
......
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