Commit a59d9367 authored by Tien Thinh NGUYEN's avatar Tien Thinh NGUYEN

Update PDU Session Status

parent f3b382bb
...@@ -98,6 +98,7 @@ constexpr uint8_t kT3502Value = 0x16; ...@@ -98,6 +98,7 @@ constexpr uint8_t kT3502Value = 0x16;
constexpr uint8_t kEquivalentPlmns = 0x4A; constexpr uint8_t kEquivalentPlmns = 0x4A;
constexpr uint8_t kIeiPduSessionStatus = 0x50;
constexpr uint8_t kIei5gsUpdateType = 0x53; constexpr uint8_t kIei5gsUpdateType = 0x53;
constexpr uint8_t kT3346Value = 0x5f; constexpr uint8_t kT3346Value = 0x5f;
......
...@@ -23,80 +23,72 @@ ...@@ -23,80 +23,72 @@
#include "3gpp_24.501.hpp" #include "3gpp_24.501.hpp"
#include "common_defs.h" #include "common_defs.h"
#include "Ie_Const.hpp"
#include "logger.hpp" #include "logger.hpp"
using namespace nas; using namespace nas;
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
PDUSessionStatus::PDUSessionStatus(uint8_t iei) { PDUSessionStatus::PDUSessionStatus() : Type4NasIe(kIeiPduSessionStatus) {
_iei = iei;
_value = 0; _value = 0;
length = 2; SetLengthIndicator(2);
SetIeName(kPduSessionStatusIeName);
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
PDUSessionStatus::PDUSessionStatus(const uint8_t iei, uint16_t value) { PDUSessionStatus::PDUSessionStatus(uint16_t value)
_iei = iei; : Type4NasIe(kIeiPduSessionStatus) {
_value = value; _value = value;
length = 2; // Lengh of IE contents SetLengthIndicator(2);
} SetIeName(kPduSessionStatusIeName);
//------------------------------------------------------------------------------
PDUSessionStatus::PDUSessionStatus() {
_iei = 0;
_value = 0;
length = 2;
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
PDUSessionStatus::~PDUSessionStatus() {} PDUSessionStatus::~PDUSessionStatus() {}
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
void PDUSessionStatus::setValue(uint8_t iei, uint16_t value) { void PDUSessionStatus::SetValue(uint16_t value) {
_iei = iei;
_value = value; _value = value;
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
uint16_t PDUSessionStatus::getValue() { uint16_t PDUSessionStatus::GetValue() const {
return _value; return _value;
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
int PDUSessionStatus::encode2Buffer(uint8_t* buf, int len) { int PDUSessionStatus::Encode(uint8_t* buf, int len) {
Logger::nas_mm().debug("Encoding PDUSessionStatus"); Logger::nas_mm().debug("Encoding %s", GetIeName().c_str());
if ((len < kPduSessionStatusMinimumLength) or (len < length + 2)) {
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) { // IEI and Length
ENCODE_U8(buf + encoded_size, _iei, encoded_size); int encoded_header_size = Type4NasIe::Encode(buf + encoded_size, len);
} if (encoded_header_size == KEncodeDecodeError) return KEncodeDecodeError;
encoded_size += encoded_header_size;
ENCODE_U8(buf + encoded_size, length, encoded_size); // Value
ENCODE_U16(buf + encoded_size, _value, encoded_size); ENCODE_U16(buf + encoded_size, _value, encoded_size);
Logger::nas_mm().debug("Encoded PDUSessionStatus, len %d", encoded_size); Logger::nas_mm().debug(
"Encoded %s, len (%d)", GetIeName().c_str(), encoded_size);
return encoded_size; return encoded_size;
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
int PDUSessionStatus::decodeFromBuffer(uint8_t* buf, int len, bool is_option) { int PDUSessionStatus::Decode(uint8_t* buf, int len, bool is_iei) {
Logger::nas_mm().debug("Decoding PDUSessionStatus"); Logger::nas_mm().debug("Decoding %s", GetIeName().c_str());
int decoded_size = 0; int decoded_size = 0;
if (is_option) {
DECODE_U8(buf + decoded_size, _iei, decoded_size); // IEI and Length
} int decoded_header_size = Type4NasIe::Decode(buf + decoded_size, len, is_iei);
DECODE_U8(buf + decoded_size, length, decoded_size); if (decoded_header_size == KEncodeDecodeError) return KEncodeDecodeError;
decoded_size += decoded_header_size;
DECODE_U16(buf + decoded_size, _value, decoded_size); DECODE_U16(buf + decoded_size, _value, decoded_size);
Logger::nas_mm().debug( Logger::nas_mm().debug(
"Decoded PDUSessionStatus value 0x%x, len %d", _value, decoded_size); "Decoded %s, value 0x%x len %d", GetIeName().c_str(), _value,
decoded_size);
return decoded_size; return decoded_size;
} }
...@@ -19,30 +19,31 @@ ...@@ -19,30 +19,31 @@
* contact@openairinterface.org * contact@openairinterface.org
*/ */
#ifndef __PDU_Session_Status_H_ #ifndef _PDU_SESSION_STATUS_H_
#define __PDU_Session_Status_H_ #define _PDU_SESSION_STATUS_H_
#include "Type4NasIe.hpp"
#include <stdint.h> #include <stdint.h>
constexpr uint8_t kPduSessionStatusMinimumLength = 4; constexpr uint8_t kPduSessionStatusMinimumLength = 4;
constexpr uint8_t kPduSessionStatusMaximumLength = 34; constexpr uint8_t kPduSessionStatusMaximumLength = 34;
constexpr auto kPduSessionStatusIeName = "PDU Session Status";
namespace nas { namespace nas {
class PDUSessionStatus { class PDUSessionStatus : Type4NasIe {
public: public:
PDUSessionStatus(); PDUSessionStatus();
PDUSessionStatus(uint8_t iei); PDUSessionStatus(uint16_t value);
PDUSessionStatus(const uint8_t iei, uint16_t value);
~PDUSessionStatus(); ~PDUSessionStatus();
void setValue(uint8_t iei, uint16_t value);
int encode2Buffer(uint8_t* buf, int len); void SetValue(uint16_t value);
int decodeFromBuffer(uint8_t* buf, int len, bool is_option); uint16_t GetValue() const;
uint16_t getValue();
int Encode(uint8_t* buf, int len);
int Decode(uint8_t* buf, int len, bool is_iei);
private: private:
uint8_t _iei;
uint8_t length;
uint16_t _value; uint16_t _value;
// TODO: spare // TODO: spare
}; };
......
...@@ -170,7 +170,7 @@ void RegistrationAccept::set_5GS_Network_Feature_Support( ...@@ -170,7 +170,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 PDUSessionStatus(0x50, value); ie_PDU_session_status = new PDUSessionStatus(value);
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
...@@ -384,7 +384,7 @@ int RegistrationAccept::encode2Buffer(uint8_t* buf, int len) { ...@@ -384,7 +384,7 @@ int RegistrationAccept::encode2Buffer(uint8_t* buf, int len) {
if (!ie_PDU_session_status) { if (!ie_PDU_session_status) {
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->Encode(
buf + encoded_size, len - encoded_size)) { buf + encoded_size, len - encoded_size)) {
encoded_size += size; encoded_size += size;
} else { } else {
...@@ -713,10 +713,10 @@ int RegistrationAccept::decodeFromBuffer(uint8_t* buf, int len) { ...@@ -713,10 +713,10 @@ int RegistrationAccept::decodeFromBuffer(uint8_t* buf, int len) {
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;
case 0x50: { case kIeiPduSessionStatus: {
Logger::nas_mm().debug("Decoding IEI (0x50)"); Logger::nas_mm().debug("Decoding IEI (0x50)");
ie_PDU_session_status = new PDUSessionStatus(); ie_PDU_session_status = new PDUSessionStatus();
decoded_size += ie_PDU_session_status->decodeFromBuffer( decoded_size += ie_PDU_session_status->Decode(
buf + decoded_size, len - decoded_size, true); buf + decoded_size, len - decoded_size, true);
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);
......
...@@ -306,13 +306,13 @@ bool RegistrationRequest::getUplinkDataStatus(uint16_t& value) { ...@@ -306,13 +306,13 @@ bool RegistrationRequest::getUplinkDataStatus(uint16_t& value) {
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
void RegistrationRequest::setPDUSessionStatus(uint16_t value) { void RegistrationRequest::setPDUSessionStatus(uint16_t value) {
ie_PDU_session_status = std::make_optional<PDUSessionStatus>(0x50, value); ie_PDU_session_status = std::make_optional<PDUSessionStatus>(value);
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
uint16_t RegistrationRequest::getPduSessionStatus() { uint16_t RegistrationRequest::getPduSessionStatus() {
if (ie_PDU_session_status.has_value()) { if (ie_PDU_session_status.has_value()) {
return ie_PDU_session_status.value().getValue(); return ie_PDU_session_status.value().GetValue();
} else { } else {
return 0; return 0;
} }
...@@ -660,7 +660,7 @@ int RegistrationRequest::encode2Buffer(uint8_t* buf, int len) { ...@@ -660,7 +660,7 @@ int RegistrationRequest::encode2Buffer(uint8_t* buf, int len) {
if (!ie_PDU_session_status.has_value()) { 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.value().encode2Buffer( if (int size = ie_PDU_session_status.value().Encode(
buf + encoded_size, len - encoded_size)) { buf + encoded_size, len - encoded_size)) {
encoded_size += size; encoded_size += size;
} else { } else {
...@@ -965,10 +965,10 @@ int RegistrationRequest::decodeFromBuffer(uint8_t* buf, int len) { ...@@ -965,10 +965,10 @@ int RegistrationRequest::decodeFromBuffer(uint8_t* buf, int len) {
Logger::nas_mm().debug("Next IEI 0x%x", octet); Logger::nas_mm().debug("Next IEI 0x%x", octet);
} break; } break;
case 0x50: { case kIeiPduSessionStatus: {
Logger::nas_mm().debug("Decoding IEI (0x50)"); Logger::nas_mm().debug("Decoding IEI 0x%x", kIeiPduSessionStatus);
PDUSessionStatus ie_PDU_session_status_tmp; PDUSessionStatus ie_PDU_session_status_tmp;
decoded_size += ie_PDU_session_status_tmp.decodeFromBuffer( decoded_size += ie_PDU_session_status_tmp.Decode(
buf + decoded_size, len - decoded_size, true); buf + decoded_size, len - decoded_size, true);
ie_PDU_session_status = ie_PDU_session_status =
std::optional<PDUSessionStatus>(ie_PDU_session_status_tmp); std::optional<PDUSessionStatus>(ie_PDU_session_status_tmp);
......
...@@ -157,8 +157,8 @@ class RegistrationRequest : public NasMmPlainHeader { ...@@ -157,8 +157,8 @@ class RegistrationRequest : public NasMmPlainHeader {
std::optional<_5GSTrackingAreaIdentity> std::optional<_5GSTrackingAreaIdentity>
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 std::optional<PDUSessionStatus> ie_PDU_session_status; // Optional
std::optional<MICOIndication> ie_MICO_indication; // Optional std::optional<MICOIndication> ie_MICO_indication; // Optional
std::optional<UEStatus> ie_ue_status; // Optional std::optional<UEStatus> ie_ue_status; // 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 PDUSessionStatus(0x50, value); ie_PDU_session_status = new PDUSessionStatus(value);
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
...@@ -71,8 +71,8 @@ int ServiceAccept::encode2Buffer(uint8_t* buf, int len) { ...@@ -71,8 +71,8 @@ int ServiceAccept::encode2Buffer(uint8_t* buf, int len) {
if (!(plain_header->encode2Buffer(buf, len))) return -1; if (!(plain_header->encode2Buffer(buf, len))) return -1;
encoded_size += 3; encoded_size += 3;
if (ie_PDU_session_status) if (ie_PDU_session_status)
encoded_size += ie_PDU_session_status->encode2Buffer( encoded_size +=
buf + encoded_size, len - encoded_size); ie_PDU_session_status->Encode(buf + encoded_size, len - encoded_size);
if (ie_session_reactivation_result) if (ie_session_reactivation_result)
encoded_size += ie_session_reactivation_result->encode2Buffer( encoded_size += ie_session_reactivation_result->encode2Buffer(
buf + encoded_size, len - encoded_size); buf + encoded_size, len - encoded_size);
......
...@@ -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 PDUSessionStatus(0x50, value); ie_PDU_session_status = new PDUSessionStatus(value);
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
...@@ -150,8 +150,8 @@ int ServiceRequest::encode2Buffer(uint8_t* buf, int len) { ...@@ -150,8 +150,8 @@ int ServiceRequest::encode2Buffer(uint8_t* buf, int len) {
if (!ie_PDU_session_status) { if (!ie_PDU_session_status) {
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 {
size = ie_PDU_session_status->encode2Buffer( size =
buf + encoded_size, len - encoded_size); ie_PDU_session_status->Encode(buf + encoded_size, len - encoded_size);
if (size != 0) { if (size != 0) {
encoded_size += size; encoded_size += size;
} else { } else {
...@@ -215,10 +215,11 @@ int ServiceRequest::decodeFromBuffer( ...@@ -215,10 +215,11 @@ int ServiceRequest::decodeFromBuffer(
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;
case 0x50: { case kIeiPduSessionStatus: {
Logger::nas_mm().debug("Decoding ie_PDU_session_status (IEI: 0x50)"); Logger::nas_mm().debug(
"Decoding ie_PDU_session_status (IEI 0x%x)", kIeiPduSessionStatus);
ie_PDU_session_status = new PDUSessionStatus(); ie_PDU_session_status = new PDUSessionStatus();
decoded_size += ie_PDU_session_status->decodeFromBuffer( decoded_size += ie_PDU_session_status->Decode(
buf + decoded_size, len - decoded_size, true); buf + decoded_size, len - decoded_size, true);
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);
...@@ -270,7 +271,7 @@ uint16_t ServiceRequest::getUplinkDataStatus() { ...@@ -270,7 +271,7 @@ uint16_t ServiceRequest::getUplinkDataStatus() {
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
uint16_t ServiceRequest::getPduSessionStatus() { uint16_t ServiceRequest::getPduSessionStatus() {
if (ie_PDU_session_status) { if (ie_PDU_session_status) {
return ie_PDU_session_status->getValue(); return ie_PDU_session_status->GetValue();
} else { } else {
return 0; return 0;
} }
......
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