Commit 8107d450 authored by Tien Thinh NGUYEN's avatar Tien Thinh NGUYEN

Code refactor for PDUSessionStaus

parent ea981d44
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
*/ */
#include "../ies/5GSMobileIdentity.hpp" #include "../ies/5GSMobileIdentity.hpp"
#include "../ies/PDUSessionStatus.hpp"
#include "NasMmPlainHeader.hpp" #include "NasMmPlainHeader.hpp"
#include "5GMMCapability.hpp" #include "5GMMCapability.hpp"
#include "5GSRegistrationType.hpp" #include "5GSRegistrationType.hpp"
...@@ -53,7 +54,6 @@ ...@@ -53,7 +54,6 @@
#include "PDU_Session_Identity_2.hpp" #include "PDU_Session_Identity_2.hpp"
#include "PDU_Session_Reactivation_Result.hpp" #include "PDU_Session_Reactivation_Result.hpp"
#include "PDU_Session_Reactivation_Result_Error_Cause.hpp" #include "PDU_Session_Reactivation_Result_Error_Cause.hpp"
#include "PDU_Session_Status.hpp"
#include "PLMN_List.hpp" #include "PLMN_List.hpp"
#include "Payload_Container.hpp" #include "Payload_Container.hpp"
#include "Payload_Container_Type.hpp" #include "Payload_Container_Type.hpp"
......
...@@ -19,13 +19,6 @@ ...@@ -19,13 +19,6 @@
* contact@openairinterface.org * contact@openairinterface.org
*/ */
/*! \file
\brief
\author Keliang DU, BUPT
\date 2020
\email: contact@openairinterface.org
*/
#ifndef _MICO_Indication_H #ifndef _MICO_Indication_H
#define _MICO_Indication_H #define _MICO_Indication_H
......
...@@ -19,93 +19,84 @@ ...@@ -19,93 +19,84 @@
* contact@openairinterface.org * contact@openairinterface.org
*/ */
/*! \file #include "PDUSessionStatus.hpp"
\brief
\author Keliang DU, BUPT
\date 2020
\email: contact@openairinterface.org
*/
#include "PDU_Session_Status.hpp"
#include "3gpp_24.501.hpp"
#include "common_defs.h" #include "common_defs.h"
#include "logger.hpp" #include "logger.hpp"
using namespace nas; using namespace nas;
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
PDU_Session_Status::PDU_Session_Status(uint8_t iei) { PDUSessionStatus::PDUSessionStatus(uint8_t iei) {
_iei = iei; _iei = iei;
_value = 0; _value = 0;
length = 0; length = 2;
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
PDU_Session_Status::PDU_Session_Status(const uint8_t iei, uint16_t value) { PDUSessionStatus::PDUSessionStatus(const uint8_t iei, uint16_t value) {
_iei = iei; _iei = iei;
_value = value; _value = value;
length = 4; length = 2; // Lengh of IE contents
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
PDU_Session_Status::PDU_Session_Status() { PDUSessionStatus::PDUSessionStatus() {
_iei = 0; _iei = 0;
_value = 0; _value = 0;
length = 0; length = 2;
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
PDU_Session_Status::~PDU_Session_Status() {} PDUSessionStatus::~PDUSessionStatus() {}
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
void PDU_Session_Status::setValue(uint8_t iei, uint16_t value) { void PDUSessionStatus::setValue(uint8_t iei, uint16_t value) {
_iei = iei; _iei = iei;
_value = value; _value = value;
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
uint16_t PDU_Session_Status::getValue() { uint16_t PDUSessionStatus::getValue() {
return _value; return _value;
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
int PDU_Session_Status::encode2Buffer(uint8_t* buf, int len) { int PDUSessionStatus::encode2Buffer(uint8_t* buf, int len) {
Logger::nas_mm().debug("encoding PDU_Session_Status iei(0x%x)", _iei); Logger::nas_mm().debug("Encoding PDUSessionStatus");
if (len < length) {
Logger::nas_mm().error("len is less than %d", length); if ((len < kPduSessionStatusMinimumLength) or (len < length + 2)) {
return 0; Logger::nas_mm().error(
"Buffer length is less than the minimum length of this IE (%d octet)",
kPduSessionStatusMinimumLength);
return KEncodeDecodeError;
} }
int encoded_size = 0; int encoded_size = 0;
if (_iei) { if (_iei) {
*(buf + encoded_size) = _iei; ENCODE_U8(buf + encoded_size, _iei, encoded_size);
encoded_size++;
*(buf + encoded_size) = length - 2;
encoded_size++;
*(buf + encoded_size) = (_value & 0x00ff);
encoded_size++;
*(buf + encoded_size) = (_value & 0xff00) >> 8;
encoded_size++;
} else {
//*(buf + encoded_size) = length - 1; encoded_size++;
//*(buf + encoded_size) = _value; encoded_size++; encoded_size++;
} }
Logger::nas_mm().debug("encoded PDU_Session_Status len(%d)", encoded_size);
ENCODE_U8(buf + encoded_size, length, encoded_size);
ENCODE_U16(buf + encoded_size, _value, encoded_size);
Logger::nas_mm().debug("Encoded PDUSessionStatus, len %d", encoded_size);
return encoded_size; return encoded_size;
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
int PDU_Session_Status::decodeFromBuffer( int PDUSessionStatus::decodeFromBuffer(uint8_t* buf, int len, bool is_option) {
uint8_t* buf, int len, bool is_option) { Logger::nas_mm().debug("Decoding PDUSessionStatus");
Logger::nas_mm().debug("decoding PDU_Session_Status iei(0x%x)", *buf);
int decoded_size = 0; int decoded_size = 0;
if (is_option) { if (is_option) {
decoded_size++; DECODE_U8(buf + decoded_size, _iei, decoded_size);
} }
DECODE_U8(buf + decoded_size, length, decoded_size);
_value = 0x0000;
length = *(buf + decoded_size);
decoded_size++;
DECODE_U16(buf + decoded_size, _value, decoded_size); DECODE_U16(buf + decoded_size, _value, decoded_size);
Logger::nas_mm().debug("decoded PDU_Session_Status value (0x%x)", _value);
Logger::nas_mm().debug("decoded PDU_Session_Status len(%d)", decoded_size); Logger::nas_mm().debug(
"Decoded PDUSessionStatus value 0x%x, len %d", _value, decoded_size);
return decoded_size; return decoded_size;
} }
...@@ -19,26 +19,22 @@ ...@@ -19,26 +19,22 @@
* contact@openairinterface.org * contact@openairinterface.org
*/ */
/*! \file
\brief
\author Keliang DU, BUPT
\date 2020
\email: contact@openairinterface.org
*/
#ifndef __PDU_Session_Status_H_ #ifndef __PDU_Session_Status_H_
#define __PDU_Session_Status_H_ #define __PDU_Session_Status_H_
#include <stdint.h> #include <stdint.h>
constexpr uint8_t kPduSessionStatusMinimumLength = 4;
constexpr uint8_t kPduSessionStatusMaximumLength = 34;
namespace nas { namespace nas {
class PDU_Session_Status { class PDUSessionStatus {
public: public:
PDU_Session_Status(); PDUSessionStatus();
PDU_Session_Status(uint8_t iei); PDUSessionStatus(uint8_t iei);
PDU_Session_Status(const uint8_t iei, uint16_t value); PDUSessionStatus(const uint8_t iei, uint16_t value);
~PDU_Session_Status(); ~PDUSessionStatus();
void setValue(uint8_t iei, uint16_t value); void setValue(uint8_t iei, uint16_t value);
int encode2Buffer(uint8_t* buf, int len); int encode2Buffer(uint8_t* buf, int len);
int decodeFromBuffer(uint8_t* buf, int len, bool is_option); int decodeFromBuffer(uint8_t* buf, int len, bool is_option);
...@@ -48,6 +44,7 @@ class PDU_Session_Status { ...@@ -48,6 +44,7 @@ class PDU_Session_Status {
uint8_t _iei; uint8_t _iei;
uint8_t length; uint8_t length;
uint16_t _value; uint16_t _value;
// TODO: spare
}; };
} // namespace nas } // namespace nas
......
...@@ -156,7 +156,7 @@ void RegistrationAccept::set_5GS_Network_Feature_Support( ...@@ -156,7 +156,7 @@ void RegistrationAccept::set_5GS_Network_Feature_Support(
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
void RegistrationAccept::setPDU_session_status(uint16_t value) { void RegistrationAccept::setPDU_session_status(uint16_t value) {
ie_PDU_session_status = new PDU_Session_Status(0x50, value); ie_PDU_session_status = new PDUSessionStatus(0x50, value);
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
...@@ -702,7 +702,7 @@ int RegistrationAccept::decodeFromBuffer( ...@@ -702,7 +702,7 @@ int RegistrationAccept::decodeFromBuffer(
} break; } break;
case 0x50: { case 0x50: {
Logger::nas_mm().debug("Decoding IEI (0x50)"); Logger::nas_mm().debug("Decoding IEI (0x50)");
ie_PDU_session_status = new PDU_Session_Status(); ie_PDU_session_status = new PDUSessionStatus();
decoded_size += ie_PDU_session_status->decodeFromBuffer( decoded_size += ie_PDU_session_status->decodeFromBuffer(
buf + decoded_size, len - decoded_size, true); buf + decoded_size, len - decoded_size, true);
octet = *(buf + decoded_size); octet = *(buf + decoded_size);
......
...@@ -93,7 +93,7 @@ class RegistrationAccept { ...@@ -93,7 +93,7 @@ class RegistrationAccept {
Rejected_NSSAI* ie_rejected_nssai; Rejected_NSSAI* ie_rejected_nssai;
NSSAI* ie_configured_nssai; NSSAI* ie_configured_nssai;
_5GS_Network_Feature_Support* ie_5gs_network_feature_support; _5GS_Network_Feature_Support* ie_5gs_network_feature_support;
PDU_Session_Status* ie_PDU_session_status; PDUSessionStatus* ie_PDU_session_status;
PDU_Session_Reactivation_Result* ie_pdu_session_reactivation_result; PDU_Session_Reactivation_Result* ie_pdu_session_reactivation_result;
PDU_Session_Reactivation_Result_Error_Cause* PDU_Session_Reactivation_Result_Error_Cause*
ie_pdu_session_reactivation_result_error_cause; ie_pdu_session_reactivation_result_error_cause;
......
...@@ -37,7 +37,7 @@ RegistrationRequest::RegistrationRequest() ...@@ -37,7 +37,7 @@ RegistrationRequest::RegistrationRequest()
ie_s1_ue_network_capability = std::nullopt; ie_s1_ue_network_capability = std::nullopt;
ie_uplink_data_status = std::nullopt; ie_uplink_data_status = std::nullopt;
ie_last_visited_registered_TAI = std::nullopt; ie_last_visited_registered_TAI = std::nullopt;
ie_PDU_session_status = nullptr; ie_PDU_session_status = std::nullopt;
ie_MICO_indicationl = nullptr; ie_MICO_indicationl = nullptr;
ie_ue_status = nullptr; ie_ue_status = nullptr;
ie_additional_guti = nullptr; ie_additional_guti = nullptr;
...@@ -310,13 +310,13 @@ bool RegistrationRequest::getUplinkDataStatus(uint16_t& value) { ...@@ -310,13 +310,13 @@ bool RegistrationRequest::getUplinkDataStatus(uint16_t& value) {
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
void RegistrationRequest::setPDU_session_status(uint16_t value) { void RegistrationRequest::setPDU_session_status(uint16_t value) {
ie_PDU_session_status = new PDU_Session_Status(0x50, value); ie_PDU_session_status = std::make_optional<PDUSessionStatus>(0x50, value);
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
uint16_t RegistrationRequest::getPduSessionStatus() { uint16_t RegistrationRequest::getPduSessionStatus() {
if (ie_PDU_session_status) { if (ie_PDU_session_status.has_value()) {
return ie_PDU_session_status->getValue(); return ie_PDU_session_status.value().getValue();
} else { } else {
return 0; return 0;
} }
...@@ -329,7 +329,7 @@ void RegistrationRequest::setMICO_Indication(bool sprti, bool raai) { ...@@ -329,7 +329,7 @@ void RegistrationRequest::setMICO_Indication(bool sprti, bool raai) {
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
bool RegistrationRequest::getMicoIndication(uint8_t& sprti, uint8_t& raai) { bool RegistrationRequest::getMicoIndication(uint8_t& sprti, uint8_t& raai) {
if (ie_PDU_session_status) { if (ie_PDU_session_status.has_value()) {
sprti = ie_MICO_indicationl->getSPRTI(); sprti = ie_MICO_indicationl->getSPRTI();
raai = ie_MICO_indicationl->getRAAI(); raai = ie_MICO_indicationl->getRAAI();
return true; return true;
...@@ -658,10 +658,10 @@ int RegistrationRequest::encode2Buffer(uint8_t* buf, int len) { ...@@ -658,10 +658,10 @@ int RegistrationRequest::encode2Buffer(uint8_t* buf, int len) {
return 0; return 0;
} }
} }
if (!ie_PDU_session_status) { if (!ie_PDU_session_status.has_value()) {
Logger::nas_mm().warn("IE ie_PDU_session_status is not available"); Logger::nas_mm().warn("IE ie_PDU_session_status is not available");
} else { } else {
if (int size = ie_PDU_session_status->encode2Buffer( if (int size = ie_PDU_session_status.value().encode2Buffer(
buf + encoded_size, len - encoded_size)) { buf + encoded_size, len - encoded_size)) {
encoded_size += size; encoded_size += size;
} else { } else {
...@@ -960,9 +960,11 @@ int RegistrationRequest::decodeFromBuffer(uint8_t* buf, int len) { ...@@ -960,9 +960,11 @@ int RegistrationRequest::decodeFromBuffer(uint8_t* buf, int len) {
} break; } break;
case 0x50: { case 0x50: {
Logger::nas_mm().debug("Decoding IEI (0x50)"); Logger::nas_mm().debug("Decoding IEI (0x50)");
ie_PDU_session_status = new PDU_Session_Status(); PDUSessionStatus ie_PDU_session_status_tmp;
decoded_size += ie_PDU_session_status->decodeFromBuffer( decoded_size += ie_PDU_session_status_tmp.decodeFromBuffer(
buf + decoded_size, len - decoded_size, true); buf + decoded_size, len - decoded_size, true);
ie_PDU_session_status =
std::optional<PDUSessionStatus>(ie_PDU_session_status_tmp);
octet = *(buf + decoded_size); octet = *(buf + decoded_size);
Logger::nas_mm().debug("Next IEI 0x%x", octet); Logger::nas_mm().debug("Next IEI 0x%x", octet);
} break; } break;
......
...@@ -160,8 +160,8 @@ class RegistrationRequest : public NasMmPlainHeader { ...@@ -160,8 +160,8 @@ class RegistrationRequest : public NasMmPlainHeader {
ie_last_visited_registered_TAI; // Optional ie_last_visited_registered_TAI; // Optional
std::optional<UENetworkCapability> ie_s1_ue_network_capability; // Optional std::optional<UENetworkCapability> ie_s1_ue_network_capability; // Optional
std::optional<UplinkDataStatus> ie_uplink_data_status; // Optional std::optional<UplinkDataStatus> ie_uplink_data_status; // Optional
std::optional<PDUSessionStatus> ie_PDU_session_status; // Optional
PDU_Session_Status* ie_PDU_session_status; // Optional
MICO_Indication* ie_MICO_indicationl; // Optional MICO_Indication* ie_MICO_indicationl; // Optional
UE_Status* ie_ue_status; // Optional UE_Status* ie_ue_status; // Optional
_5GSMobileIdentity* ie_additional_guti; // Optional _5GSMobileIdentity* ie_additional_guti; // Optional
......
...@@ -52,7 +52,7 @@ void ServiceAccept::setHeader(uint8_t security_header_type) { ...@@ -52,7 +52,7 @@ void ServiceAccept::setHeader(uint8_t security_header_type) {
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
void ServiceAccept::setPDU_session_status(uint16_t value) { void ServiceAccept::setPDU_session_status(uint16_t value) {
ie_PDU_session_status = new PDU_Session_Status(0x50, value); ie_PDU_session_status = new PDUSessionStatus(0x50, value);
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
......
...@@ -50,7 +50,7 @@ class ServiceAccept { ...@@ -50,7 +50,7 @@ class ServiceAccept {
private: private:
NasMmPlainHeader* plain_header; NasMmPlainHeader* plain_header;
PDU_Session_Status* ie_PDU_session_status; PDUSessionStatus* ie_PDU_session_status;
PDU_Session_Reactivation_Result* ie_session_reactivation_result; PDU_Session_Reactivation_Result* ie_session_reactivation_result;
}; };
......
...@@ -79,7 +79,7 @@ void ServiceRequest::setUplink_data_status(uint16_t value) { ...@@ -79,7 +79,7 @@ void ServiceRequest::setUplink_data_status(uint16_t value) {
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
void ServiceRequest::setPDU_session_status(uint16_t value) { void ServiceRequest::setPDU_session_status(uint16_t value) {
ie_PDU_session_status = new PDU_Session_Status(0x50, value); ie_PDU_session_status = new PDUSessionStatus(0x50, value);
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
...@@ -216,7 +216,7 @@ int ServiceRequest::decodeFromBuffer( ...@@ -216,7 +216,7 @@ int ServiceRequest::decodeFromBuffer(
} break; } break;
case 0x50: { case 0x50: {
Logger::nas_mm().debug("Decoding ie_PDU_session_status (IEI: 0x50)"); Logger::nas_mm().debug("Decoding ie_PDU_session_status (IEI: 0x50)");
ie_PDU_session_status = new PDU_Session_Status(); ie_PDU_session_status = new PDUSessionStatus();
decoded_size += ie_PDU_session_status->decodeFromBuffer( decoded_size += ie_PDU_session_status->decodeFromBuffer(
buf + decoded_size, len - decoded_size, true); buf + decoded_size, len - decoded_size, true);
octet = *(buf + decoded_size); octet = *(buf + decoded_size);
......
...@@ -70,7 +70,7 @@ class ServiceRequest { ...@@ -70,7 +70,7 @@ class ServiceRequest {
ServiceType* ie_service_type; ServiceType* ie_service_type;
_5GSMobileIdentity* ie_5g_s_tmsi; _5GSMobileIdentity* ie_5g_s_tmsi;
UplinkDataStatus* ie_uplink_data_status; UplinkDataStatus* ie_uplink_data_status;
PDU_Session_Status* ie_PDU_session_status; PDUSessionStatus* ie_PDU_session_status;
Allowed_PDU_Session_Status* ie_allowed_PDU_session_status; Allowed_PDU_Session_Status* ie_allowed_PDU_session_status;
NAS_Message_Container* ie_nas_message_container; NAS_Message_Container* ie_nas_message_container;
}; };
......
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