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

Update GS_DRX_Parameters

parent 90bc9a46
......@@ -26,7 +26,7 @@ constexpr uint8_t kIeIsNotOptional = false;
constexpr uint8_t kIei5gmmCause = 0x58;
constexpr uint8_t kIei5gsmCapability = 0x28;
constexpr uint8_t kIei5gsDrxParameters = 0x51; // OK
constexpr uint8_t kIei5gsDrxParameters = 0x51;
constexpr uint8_t kIei5gsmCongestionReAttemptIndicator = 0x61;
constexpr uint8_t kIei5gsmNetworkFeatureSupport = 0x17;
constexpr uint8_t kIei5gsMobileIdentityImeiSv = 0x77;
......@@ -91,6 +91,7 @@ constexpr uint8_t kIeiNetworkSlicingIndication = 0x09; // 9-(4 higher bits)
constexpr uint8_t kIeiMicoIndication = 0x0B; // B-(4 higher bits)
constexpr uint8_t kIei5gmmCapability = 0x10;
constexpr uint8_t kIeiUeUsageSetting = 0x18;
constexpr uint8_t kIeiAllowedPduSessionStatus = 0x25;
constexpr uint8_t kIeiUeStatus = 0x2b;
......
......@@ -21,6 +21,7 @@
#include "UEUsageSetting.hpp"
#include "Ie_Const.hpp"
#include "3gpp_24.501.hpp"
#include "common_defs.h"
#include "logger.hpp"
......@@ -28,77 +29,82 @@
using namespace nas;
//------------------------------------------------------------------------------
UEUsageSetting::UEUsageSetting(uint8_t iei) {
_iei = iei;
_ues_usage_setting = false;
UEUsageSetting::UEUsageSetting() : Type4NasIe(kIeiUeUsageSetting) {
ues_usage_setting_ = false;
SetLengthIndicator(1);
SetIeName(kUeUsageSettingIeName);
}
//------------------------------------------------------------------------------
UEUsageSetting::UEUsageSetting(const uint8_t iei, bool ues_usage_setting) {
_iei = iei;
_ues_usage_setting = ues_usage_setting;
}
//------------------------------------------------------------------------------
UEUsageSetting::UEUsageSetting() {
_iei = 0;
_ues_usage_setting = false;
UEUsageSetting::UEUsageSetting(bool ues_usage_setting)
: Type4NasIe(kIeiUeUsageSetting) {
ues_usage_setting_ = ues_usage_setting;
SetLengthIndicator(1);
SetIeName(kUeUsageSettingIeName);
}
//------------------------------------------------------------------------------
UEUsageSetting::~UEUsageSetting() {}
//------------------------------------------------------------------------------
void UEUsageSetting::setValue(bool value) {
_ues_usage_setting = value;
void UEUsageSetting::SetValue(bool value) {
ues_usage_setting_ = value;
}
//------------------------------------------------------------------------------
bool UEUsageSetting::getValue() {
return _ues_usage_setting;
bool UEUsageSetting::GetValue() const {
return ues_usage_setting_;
}
//------------------------------------------------------------------------------
int UEUsageSetting::encode2Buffer(uint8_t* buf, int len) {
Logger::nas_mm().debug("Encoding UEUsageSetting (iei 0x%x)", _iei);
int UEUsageSetting::Encode(uint8_t* buf, int len) {
Logger::nas_mm().debug("Encoding %s", GetIeName().c_str());
if ((len < kUEUsageSettingLength) or (len < length + 2)) {
if (len < kUeUsageSettingLength) {
Logger::nas_mm().error(
"Buffer length is less than the minimum length of this IE (%d octet)",
kUEUsageSettingLength);
kUeUsageSettingLength);
return KEncodeDecodeError;
}
int encoded_size = 0;
if (_iei) {
ENCODE_U8(buf + encoded_size, _iei, encoded_size);
}
// IEI and Length
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);
ENCODE_U8(buf + encoded_size, 0x01 & _ues_usage_setting, encoded_size);
ENCODE_U8(buf + encoded_size, 0x01 & ues_usage_setting_, encoded_size);
Logger::nas_mm().debug("Encoded UEUsageSetting (len %d)", encoded_size);
Logger::nas_mm().debug(
"Encoded %s, len (%d)", GetIeName().c_str(), encoded_size);
return encoded_size;
}
//------------------------------------------------------------------------------
int UEUsageSetting::decodeFromBuffer(uint8_t* buf, int len, bool is_option) {
Logger::nas_mm().debug("Decoding UEUsageSetting");
int UEUsageSetting::Decode(uint8_t* buf, int len, bool is_iei) {
Logger::nas_mm().debug("Decoding %s", GetIeName().c_str());
int decoded_size = 0;
if (is_option) {
DECODE_U8(buf + decoded_size, _iei, decoded_size);
if (len < kUeUsageSettingLength) {
Logger::nas_mm().error(
"Buffer length is less than the minimum length of this IE (%d octet)",
kUeUsageSettingLength);
return KEncodeDecodeError;
}
DECODE_U8(buf + decoded_size, length, decoded_size);
int decoded_size = 0;
// IEI and Length
int decoded_header_size = Type4NasIe::Decode(buf + decoded_size, len, true);
if (decoded_header_size == KEncodeDecodeError) return KEncodeDecodeError;
decoded_size += decoded_header_size;
uint8_t octet = 0;
DECODE_U8(buf + decoded_size, octet, decoded_size);
_ues_usage_setting = octet & 0x01;
ues_usage_setting_ = octet & 0x01;
Logger::nas_mm().debug(
"Decoded UE's Usage Setting, UE's Usage Setting 0x%x, IEI 0x%x, decoded "
"len %d",
_ues_usage_setting, _iei, decoded_size);
"Decoded %s, UE's Usage Setting 0x%x, len %d", GetIeName().c_str(),
ues_usage_setting_, decoded_size);
return decoded_size;
}
......@@ -22,27 +22,29 @@
#ifndef _UES_USAGE_SETTING_H_
#define _UES_USAGE_SETTING_H_
#include "Type4NasIe.hpp"
#include <stdint.h>
constexpr uint8_t kUEUsageSettingLength = 3;
constexpr uint8_t kUeUsageSettingLength = 3;
constexpr auto kUeUsageSettingIeName = "UE's Usage Setting";
namespace nas {
class UEUsageSetting {
class UEUsageSetting : public Type4NasIe {
public:
UEUsageSetting();
UEUsageSetting(uint8_t iei);
UEUsageSetting(const uint8_t iei, bool ues_usage_setting);
UEUsageSetting(bool ues_usage_setting);
~UEUsageSetting();
int encode2Buffer(uint8_t* buf, int len);
int decodeFromBuffer(uint8_t* buf, int len, bool is_option);
void setValue(bool value);
bool getValue();
int Encode(uint8_t* buf, int len);
int Decode(uint8_t* buf, int len, bool is_iei = true);
void SetValue(bool value);
bool GetValue() const;
private:
uint8_t _iei;
uint8_t length;
bool _ues_usage_setting;
bool ues_usage_setting_;
};
} // namespace nas
......
......@@ -21,6 +21,7 @@
#include "_5GS_DRX_Parameters.hpp"
#include "Ie_Const.hpp"
#include "3gpp_24.501.hpp"
#include "common_defs.h"
#include "logger.hpp"
......@@ -28,40 +29,35 @@
using namespace nas;
//------------------------------------------------------------------------------
_5GS_DRX_Parameters::_5GS_DRX_Parameters(uint8_t iei) {
_iei = iei;
length = 1;
_value = 0;
}
//------------------------------------------------------------------------------
_5GS_DRX_Parameters::_5GS_DRX_Parameters(const uint8_t iei, uint8_t value) {
_iei = iei;
length = 1;
_5GS_DRX_Parameters::_5GS_DRX_Parameters(uint8_t value)
: Type4NasIe(kIei5gsDrxParameters) {
_value = value & 0x0F;
SetLengthIndicator(1);
SetIeName(k5gsDrxParametersIeName);
}
//------------------------------------------------------------------------------
_5GS_DRX_Parameters::_5GS_DRX_Parameters() {
_iei = 0;
length = 1;
_value = 0;
SetLengthIndicator(1);
SetIeName(k5gsDrxParametersIeName);
}
_5GS_DRX_Parameters::~_5GS_DRX_Parameters() {}
//------------------------------------------------------------------------------
void _5GS_DRX_Parameters::setValue(uint8_t value) {
void _5GS_DRX_Parameters::SetValue(uint8_t value) {
_value = value & 0x0F;
}
//------------------------------------------------------------------------------
uint8_t _5GS_DRX_Parameters::getValue() {
uint8_t _5GS_DRX_Parameters::GetValue() const {
return _value;
}
//------------------------------------------------------------------------------
int _5GS_DRX_Parameters::encode2Buffer(uint8_t* buf, int len) {
Logger::nas_mm().debug("encoding _5GS_DRX_Parameters iei(0x%x)", _iei);
int _5GS_DRX_Parameters::Encode(uint8_t* buf, int len) {
Logger::nas_mm().debug("Encoding %s", GetIeName().c_str());
if (len < k5gsDrxParametersLength) {
Logger::nas_mm().error(
"Buffer length is less than the minimum length of this IE (%d octet)",
......@@ -70,32 +66,42 @@ int _5GS_DRX_Parameters::encode2Buffer(uint8_t* buf, int len) {
}
int encoded_size = 0;
if (_iei) {
ENCODE_U8(buf + encoded_size, _iei, encoded_size);
}
ENCODE_U8(buf + encoded_size, length, encoded_size);
// IEI and Length
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, _value, encoded_size);
Logger::nas_mm().debug("Encoded _5GS_DRX_Parameters (len %d)", encoded_size);
Logger::nas_mm().debug(
"Encoded %s, len (%d)", GetIeName().c_str(), encoded_size);
return encoded_size;
}
//------------------------------------------------------------------------------
int _5GS_DRX_Parameters::decodeFromBuffer(
uint8_t* buf, int len, bool is_option) {
Logger::nas_mm().debug("Decoding _5GS_DRX_Parameters");
int _5GS_DRX_Parameters::Decode(uint8_t* buf, int len, bool is_iei) {
Logger::nas_mm().debug("Decoding %s", GetIeName().c_str());
int decoded_size = 0;
if (is_option) {
DECODE_U8(buf + decoded_size, _iei, decoded_size);
if (len < k5gsDrxParametersLength) {
Logger::nas_mm().error(
"Buffer length is less than the minimum length of this IE (%d octet)",
k5gsDrxParametersLength);
return KEncodeDecodeError;
}
DECODE_U8(buf + decoded_size, length, decoded_size);
int decoded_size = 0;
// IEI and Length
int decoded_header_size = Type4NasIe::Decode(buf + decoded_size, len, true);
if (decoded_header_size == KEncodeDecodeError) return KEncodeDecodeError;
decoded_size += decoded_header_size;
uint8_t octet = 0;
DECODE_U8(buf + decoded_size, octet, decoded_size);
_value = octet & 0x0f;
Logger::nas_mm().debug(
"Decoded _5GS_DRX_Parameters DRX (value 0x%x)", _value);
Logger::nas_mm().debug("Decoded _5GS_DRX_Parameters (len %d)", decoded_size);
"Decoded %s, DRX value 0x%x, len %d", GetIeName().c_str(), _value,
decoded_size);
return decoded_size;
}
......@@ -19,29 +19,31 @@
* contact@openairinterface.org
*/
#ifndef _5GS_DRX_Parameters_H_
#define _5GS_DRX_Parameters_H_
#ifndef _5GS_DRX_PARAMETERS_H_
#define _5GS_DRX_PARAMETERS_H_
#include "Type4NasIe.hpp"
#include <stdint.h>
constexpr uint8_t k5gsDrxParametersLength = 3;
constexpr auto k5gsDrxParametersIeName = "5GS DRX Parameters";
namespace nas {
class _5GS_DRX_Parameters {
class _5GS_DRX_Parameters : public Type4NasIe {
public:
_5GS_DRX_Parameters();
_5GS_DRX_Parameters(uint8_t iei);
_5GS_DRX_Parameters(const uint8_t iei, uint8_t value);
_5GS_DRX_Parameters(uint8_t value);
~_5GS_DRX_Parameters();
int encode2Buffer(uint8_t* buf, int len);
int decodeFromBuffer(uint8_t* buf, int len, bool is_option);
void setValue(uint8_t value);
uint8_t getValue();
int Encode(uint8_t* buf, int len);
int Decode(uint8_t* buf, int len, bool is_iei);
void SetValue(uint8_t value);
uint8_t GetValue() const;
private:
uint8_t _iei;
uint8_t length;
uint8_t _value;
};
} // namespace nas
......
......@@ -232,7 +232,7 @@ void RegistrationAccept::setNSSAI_Inclusion_Mode(uint8_t value) {
//------------------------------------------------------------------------------
void RegistrationAccept::set_5GS_DRX_arameters(uint8_t value) {
ie_negotiated_drx_parameters = new _5GS_DRX_Parameters(0x51, value);
ie_negotiated_drx_parameters = new _5GS_DRX_Parameters(value);
}
//------------------------------------------------------------------------------
......@@ -512,7 +512,7 @@ int RegistrationAccept::encode2Buffer(uint8_t* buf, int len) {
if (!ie_negotiated_drx_parameters) {
Logger::nas_mm().warn("IE ie_negotiated_drx_parameters is not available");
} else {
if (int size = ie_negotiated_drx_parameters->encode2Buffer(
if (int size = ie_negotiated_drx_parameters->Encode(
buf + encoded_size, len - encoded_size)) {
encoded_size += size;
} else {
......@@ -781,10 +781,10 @@ int RegistrationAccept::decodeFromBuffer(uint8_t* buf, int len) {
octet = *(buf + decoded_size);
Logger::nas_mm().debug("Next IEI (0x%x)", octet);
} break;
case 0x51: {
Logger::nas_mm().debug("Decoding IEI (0x51)");
case kIei5gsDrxParameters: {
Logger::nas_mm().debug("Decoding IEI (0x%x)", kIei5gsDrxParameters);
ie_negotiated_drx_parameters = new _5GS_DRX_Parameters();
decoded_size += ie_negotiated_drx_parameters->decodeFromBuffer(
decoded_size += ie_negotiated_drx_parameters->Decode(
buf + decoded_size, len - decoded_size, true);
octet = *(buf + decoded_size);
Logger::nas_mm().debug("Next IEI (0x%x)", octet);
......
......@@ -367,14 +367,13 @@ uint16_t RegistrationRequest::getAllowedPduSessionStatus() {
//------------------------------------------------------------------------------
void RegistrationRequest::setUES_Usage_Setting(bool ues_usage_setting) {
ie_ues_usage_setting =
std::make_optional<UEUsageSetting>(0x18, ues_usage_setting);
ie_ues_usage_setting = std::make_optional<UEUsageSetting>(ues_usage_setting);
}
//------------------------------------------------------------------------------
uint8_t RegistrationRequest::getUEsUsageSetting() {
if (ie_ues_usage_setting.has_value()) {
return ie_ues_usage_setting.value().getValue();
return ie_ues_usage_setting.value().GetValue();
} else {
return 0;
}
......@@ -382,14 +381,13 @@ uint8_t RegistrationRequest::getUEsUsageSetting() {
//------------------------------------------------------------------------------
void RegistrationRequest::set_5GS_DRX_arameters(uint8_t value) {
ie_5gs_drx_parameters =
std::make_optional<_5GS_DRX_Parameters>(kIei5gsDrxParameters, value);
ie_5gs_drx_parameters = std::make_optional<_5GS_DRX_Parameters>(value);
}
//------------------------------------------------------------------------------
uint8_t RegistrationRequest::get5GSDrxParameters() {
if (ie_5gs_drx_parameters.has_value()) {
return ie_5gs_drx_parameters.value().getValue();
return ie_5gs_drx_parameters.value().GetValue();
} else {
return 0;
}
......@@ -715,7 +713,7 @@ int RegistrationRequest::encode2Buffer(uint8_t* buf, int len) {
if (!ie_ues_usage_setting.has_value()) {
Logger::nas_mm().warn("IE ie_ues_usage_setting is not available");
} else {
if (int size = ie_ues_usage_setting.value().encode2Buffer(
if (int size = ie_ues_usage_setting.value().Encode(
buf + encoded_size, len - encoded_size)) {
encoded_size += size;
} else {
......@@ -726,7 +724,7 @@ int RegistrationRequest::encode2Buffer(uint8_t* buf, int len) {
if (!ie_5gs_drx_parameters.has_value()) {
Logger::nas_mm().warn("IE ie_5gs_drx_parameters is not available");
} else {
if (int size = ie_5gs_drx_parameters.value().encode2Buffer(
if (int size = ie_5gs_drx_parameters.value().Encode(
buf + encoded_size, len - encoded_size)) {
encoded_size += size;
} else {
......@@ -1006,10 +1004,10 @@ int RegistrationRequest::decodeFromBuffer(uint8_t* buf, int len) {
Logger::nas_mm().debug("Next IEI 0x%x", octet);
} break;
case 0x18: {
Logger::nas_mm().debug("Decoding IEI(0x18)");
case kIeiUeUsageSetting: {
Logger::nas_mm().debug("Decoding IEI 0x%x", kIeiUeUsageSetting);
UEUsageSetting ie_ues_usage_setting_tmp = {};
decoded_size += ie_ues_usage_setting_tmp.decodeFromBuffer(
decoded_size += ie_ues_usage_setting_tmp.Decode(
buf + decoded_size, len - decoded_size, true);
ie_ues_usage_setting =
std::optional<UEUsageSetting>(ie_ues_usage_setting_tmp);
......@@ -1019,7 +1017,7 @@ int RegistrationRequest::decodeFromBuffer(uint8_t* buf, int len) {
case kIei5gsDrxParameters: {
Logger::nas_mm().debug("Decoding IEI 0x51: 5GS DRX Parameters");
_5GS_DRX_Parameters ie_5gs_drx_parameters_tmp = {};
decoded_size += ie_5gs_drx_parameters_tmp.decodeFromBuffer(
decoded_size += ie_5gs_drx_parameters_tmp.Decode(
buf + decoded_size, len - decoded_size, true);
ie_5gs_drx_parameters =
std::optional<_5GS_DRX_Parameters>(ie_5gs_drx_parameters_tmp);
......
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