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

Update UE Radio Capability Id

parent 151b7e93
...@@ -120,6 +120,7 @@ constexpr uint8_t kIei5gsUpdateType = 0x53; ...@@ -120,6 +120,7 @@ constexpr uint8_t kIei5gsUpdateType = 0x53;
constexpr uint8_t kT3346Value = 0x5f; constexpr uint8_t kT3346Value = 0x5f;
constexpr uint8_t kIeiEpsBearerContextStatus = 0x60; constexpr uint8_t kIeiEpsBearerContextStatus = 0x60;
constexpr uint8_t kIeiUeRadioCapabilityId = 0x67;
constexpr uint8_t kIeiRejectedNssaiRr = 0x69; constexpr uint8_t kIeiRejectedNssaiRr = 0x69;
constexpr uint8_t kIeiGprsTimer3T3324 = 0x6A; constexpr uint8_t kIeiGprsTimer3T3324 = 0x6A;
constexpr uint8_t kIeiGprsTimer3T3348 = 0x6B; constexpr uint8_t kIeiGprsTimer3T3348 = 0x6B;
......
...@@ -19,90 +19,100 @@ ...@@ -19,90 +19,100 @@
* contact@openairinterface.org * contact@openairinterface.org
*/ */
/*! \file
\brief
\author Keliang DU, BUPT
\date 2020
\email: contact@openairinterface.org
*/
#include "UE_Radio_Capability_ID.hpp" #include "UE_Radio_Capability_ID.hpp"
#include "3gpp_24.501.hpp"
#include "common_defs.h"
#include "Ie_Const.hpp"
#include "logger.hpp" #include "logger.hpp"
using namespace nas; using namespace nas;
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
UE_Radio_Capability_ID::UE_Radio_Capability_ID(uint8_t iei) { UE_Radio_Capability_ID::UE_Radio_Capability_ID()
_iei = iei; : Type4NasIe(kIeiUeRadioCapabilityId), value_() {
_value = 0; SetLengthIndicator(0);
} SetIeName(kUeRadioCapabilityIdIeName);
//------------------------------------------------------------------------------
UE_Radio_Capability_ID::UE_Radio_Capability_ID(
const uint8_t iei, uint8_t value) {
_iei = iei;
_value = value;
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
UE_Radio_Capability_ID::UE_Radio_Capability_ID() { UE_Radio_Capability_ID::UE_Radio_Capability_ID(bstring value)
_iei = 0; : Type4NasIe(kIeiUeRadioCapabilityId) {
_value = 0; value_ = bstrcpy(value);
SetLengthIndicator(blength(value_));
SetIeName(kUeRadioCapabilityIdIeName);
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
UE_Radio_Capability_ID::~UE_Radio_Capability_ID() {} UE_Radio_Capability_ID::~UE_Radio_Capability_ID() {}
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
void UE_Radio_Capability_ID::setValue(uint8_t value) { void UE_Radio_Capability_ID::setValue(bstring value) {
_value = value; value_ = bstrcpy(value);
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
uint8_t UE_Radio_Capability_ID::getValue() { void UE_Radio_Capability_ID::getValue(bstring& value) const {
return _value; value = bstrcpy(value_);
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
int UE_Radio_Capability_ID::Encode(uint8_t* buf, int len) { int UE_Radio_Capability_ID::Encode(uint8_t* buf, int len) {
Logger::nas_mm().debug("encoding UE_Radio_Capability_ID iei(0x%x)", _iei); Logger::nas_mm().debug("Encoding %s", GetIeName().c_str());
if (len < 3) {
Logger::nas_mm().error("len is less than 3");
return 0;
}
int encoded_size = 0; int encoded_size = 0;
if (_iei) { int ie_len = GetIeLength();
*(buf + encoded_size) = _iei; if (len < ie_len) { // Length of the content + IEI/Len
encoded_size++; Logger::nas_mm().error(
*(buf + encoded_size) = 1; "Size of the buffer is not enough to store this IE (IE len %d)",
encoded_size++; ie_len);
*(buf + encoded_size) = _value; return KEncodeDecodeError;
encoded_size++;
} else {
// *(buf + encoded_size) = length - 1; encoded_size++;
// *(buf + encoded_size) = _value; encoded_size++; encoded_size++;
} }
// IEI and Length (later)
int len_pos = 0;
int encoded_header_size =
Type4NasIe::Encode(buf + encoded_size, len, len_pos);
if (encoded_header_size == KEncodeDecodeError) return KEncodeDecodeError;
encoded_size += encoded_header_size;
// Value
int size = encode_bstring(value_, (buf + encoded_size), len - encoded_size);
encoded_size += size;
// Encode length
int encoded_len_ie = 0;
ENCODE_U16(buf + len_pos, encoded_size - GetHeaderLength(), encoded_len_ie);
Logger::nas_mm().debug( Logger::nas_mm().debug(
"encoded UE_Radio_Capability_ID len(%d)", encoded_size); "Encoded %s, len (%d)", GetIeName().c_str(), encoded_size);
return encoded_size; return encoded_size;
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
int UE_Radio_Capability_ID::Decode(uint8_t* buf, int len, bool is_option) { int UE_Radio_Capability_ID::Decode(uint8_t* buf, int len, bool is_iei) {
Logger::nas_mm().debug("decoding UE_Radio_Capability_ID iei(0x%x)", *buf); Logger::nas_mm().debug("Decoding %s", GetIeName().c_str());
int decoded_size = 0; int decoded_size = 0;
if (is_option) {
_iei = *buf; // IEI and Length
decoded_size++; int decoded_header_size = Type4NasIe::Decode(buf + decoded_size, len, is_iei);
if (decoded_header_size == KEncodeDecodeError) return KEncodeDecodeError;
decoded_size += decoded_header_size;
uint16_t ie_len = 0;
ie_len = GetLengthIndicator();
if (len < GetIeLength()) {
Logger::nas_mm().error("Len is less than %d", GetIeLength());
return KEncodeDecodeError;
} }
_value = 0x00;
// length = *(buf + decoded_size); // Value
decoded_size++; decode_bstring(&value_, ie_len, (buf + decoded_size), len - decoded_size);
_value = *(buf + decoded_size); decoded_size += ie_len;
decoded_size++; for (int i = 0; i < ie_len; i++) {
Logger::nas_mm().debug( Logger::nas_mm().debug(
"decoded UE_Radio_Capability_ID _value(0x%x),iei(0x%x)", _value, _iei); "Decoded NasMessageContainer value 0x%x", (uint8_t) value_->data[i]);
}
Logger::nas_mm().debug( Logger::nas_mm().debug(
"decoded UE_Radio_Capability_ID len(%d)", decoded_size); "Decoded %s, len (%d)", GetIeName().c_str(), decoded_size);
return decoded_size; return decoded_size;
} }
...@@ -19,34 +19,35 @@ ...@@ -19,34 +19,35 @@
* contact@openairinterface.org * contact@openairinterface.org
*/ */
/*! \file #ifndef _UE_RADIO_CAPABILITY_ID_H_
\brief #define _UE_RADIO_CAPABILITY_ID_H_
\author Keliang DU, BUPT
\date 2020
\email: contact@openairinterface.org
*/
#ifndef __UE_Radio_Capability_ID_H_
#define __UE_Radio_Capability_ID_H_
#include "Type4NasIe.hpp"
#include <stdint.h> #include <stdint.h>
extern "C" {
#include "TLVDecoder.h"
#include "TLVEncoder.h"
#include "bstrlib.h"
}
constexpr auto kUeRadioCapabilityIdIeName = "UE Radio Capability ID";
namespace nas { namespace nas {
class UE_Radio_Capability_ID { class UE_Radio_Capability_ID : public Type4NasIe {
public: public:
UE_Radio_Capability_ID(); UE_Radio_Capability_ID();
UE_Radio_Capability_ID(uint8_t iei); UE_Radio_Capability_ID(bstring value);
UE_Radio_Capability_ID(const uint8_t iei, uint8_t value);
~UE_Radio_Capability_ID(); ~UE_Radio_Capability_ID();
int Encode(uint8_t* buf, int len); int Encode(uint8_t* buf, int len);
int Decode(uint8_t* buf, int len, bool is_option); int Decode(uint8_t* buf, int len, bool is_iei);
void setValue(uint8_t value); void setValue(bstring value);
uint8_t getValue(); void getValue(bstring& value) const;
private: private:
uint8_t _iei; bstring value_;
uint8_t _value;
}; };
} // namespace nas } // namespace nas
......
...@@ -249,7 +249,7 @@ void RegistrationAccept::set_5GS_DRX_arameters(uint8_t value) { ...@@ -249,7 +249,7 @@ void RegistrationAccept::set_5GS_DRX_arameters(uint8_t value) {
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
void RegistrationAccept::setNon_3GPP_NW_Provided_Policies(uint8_t value) { void RegistrationAccept::setNon_3GPP_NW_Provided_Policies(uint8_t value) {
ie_non_3gpp_nw_policies = ie_non_3gpp_nw_policies =
std::make_optional<Non_3GPP_NW_Provided_Policies>(0x0D, value); std::make_optional<Non_3GPP_NW_Provided_Policies>(value);
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
...@@ -262,7 +262,7 @@ void RegistrationAccept::setEPS_Bearer_Context_Status(uint16_t value) { ...@@ -262,7 +262,7 @@ void RegistrationAccept::setEPS_Bearer_Context_Status(uint16_t value) {
void RegistrationAccept::setExtended_DRX_Parameters( void RegistrationAccept::setExtended_DRX_Parameters(
uint8_t paging_time, uint8_t value) { uint8_t paging_time, uint8_t value) {
ie_extended_drx_parameters = ie_extended_drx_parameters =
std::make_optional<Extended_DRX_Parameters>(0x6E, paging_time, value); std::make_optional<Extended_DRX_Parameters>(paging_time, value);
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
...@@ -281,9 +281,8 @@ void RegistrationAccept::setT3324_Value(uint8_t unit, uint8_t value) { ...@@ -281,9 +281,8 @@ void RegistrationAccept::setT3324_Value(uint8_t unit, uint8_t value) {
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
void RegistrationAccept::setUE_Radio_Capability_ID(uint8_t value) { void RegistrationAccept::setUE_Radio_Capability_ID(bstring value) {
ie_ue_radio_capability_id = ie_ue_radio_capability_id = std::make_optional<UE_Radio_Capability_ID>(value);
std::make_optional<UE_Radio_Capability_ID>(0x67, value);
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
......
...@@ -139,7 +139,7 @@ class RegistrationAccept : public NasMmPlainHeader { ...@@ -139,7 +139,7 @@ class RegistrationAccept : public NasMmPlainHeader {
void setT3324_Value(uint8_t unit, uint8_t value); void setT3324_Value(uint8_t unit, uint8_t value);
// TODO: Get // TODO: Get
void setUE_Radio_Capability_ID(uint8_t value); void setUE_Radio_Capability_ID(bstring value);
// TODO: Get // TODO: Get
void setPending_NSSAI(std::vector<struct SNSSAI_s> nssai); void setPending_NSSAI(std::vector<struct SNSSAI_s> nssai);
...@@ -189,8 +189,13 @@ class RegistrationAccept : public NasMmPlainHeader { ...@@ -189,8 +189,13 @@ class RegistrationAccept : public NasMmPlainHeader {
std::optional<GprsTimer3> ie_T3448_value; // Optional std::optional<GprsTimer3> ie_T3448_value; // Optional
std::optional<GprsTimer3> ie_T3324_value; // Optional std::optional<GprsTimer3> ie_T3324_value; // Optional
std::optional<UE_Radio_Capability_ID> std::optional<UE_Radio_Capability_ID>
ie_ue_radio_capability_id; // Which Release 16.x.x? ie_ue_radio_capability_id; // Release 16.4.1
std::optional<NSSAI> ie_pending_nssai; // Which Release 16.x.x? // TODO: UE radio capability ID deletion indication
std::optional<NSSAI> ie_pending_nssai; // Release 16.4.1
// TODO: Ciphering key data (Release 16.4.1)
// TODO: CAG information list (Release 16.4.1)
// TODO: Truncated 5G-S-TMSI configuration (Release 16.4.1)
// TODO: Negotiated WUS assistance information (Release 16.4.1)
}; };
} // namespace nas } // namespace nas
......
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