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

Update 5GS Network Feature Support/PDU Session Reactivation Result

parent 6017dac1
...@@ -98,8 +98,9 @@ constexpr uint8_t kIeiAuthenticationParameterAutn = 0x20; ...@@ -98,8 +98,9 @@ constexpr uint8_t kIeiAuthenticationParameterAutn = 0x20;
constexpr uint8_t kIeiAuthenticationParameterRand = 0x21; constexpr uint8_t kIeiAuthenticationParameterRand = 0x21;
constexpr uint8_t kIei5gsNetworkFeatureSupport = 0x21; constexpr uint8_t kIei5gsNetworkFeatureSupport = 0x21;
constexpr uint8_t kIeiAllowedPduSessionStatus = 0x25; constexpr uint8_t kIeiAllowedPduSessionStatus = 0x25;
constexpr uint8_t kIeiUeStatus = 0x2b; constexpr uint8_t kIeiPduSessionReactivationResult = 0x26;
constexpr uint8_t kIeiUeStatus = 0x2b;
constexpr uint8_t kIeiUeSecurityCapability = 0x2e; constexpr uint8_t kIeiUeSecurityCapability = 0x2e;
constexpr uint8_t kIeiUeNetworkCapability = 0x17; constexpr uint8_t kIeiUeNetworkCapability = 0x17;
......
...@@ -18,101 +18,104 @@ ...@@ -18,101 +18,104 @@
* For more information about the OpenAirInterface (OAI) Software Alliance: * For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org * contact@openairinterface.org
*/ */
/*! \file
\brief
\author Keliang DU, BUPT
\date 2020
\email: contact@openairinterface.org
*/
#include "PDU_Session_Reactivation_Result.hpp" #include "PDU_Session_Reactivation_Result.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;
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
PDU_Session_Reactivation_Result::PDU_Session_Reactivation_Result(uint8_t iei) { PDU_Session_Reactivation_Result::PDU_Session_Reactivation_Result()
_iei = iei; : Type4NasIe(kIeiPduSessionReactivationResult) {
_value = 0; SetLengthIndicator(2);
length = 0; SetIeName(kPduSessionReactivationResultIeName);
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
PDU_Session_Reactivation_Result::PDU_Session_Reactivation_Result( PDU_Session_Reactivation_Result::PDU_Session_Reactivation_Result(uint16_t value)
const uint8_t iei, uint16_t value) { : Type4NasIe(kIeiPduSessionReactivationResult) {
_iei = iei;
_value = value; _value = value;
length = 4; SetLengthIndicator(2);
} SetIeName(kPduSessionReactivationResultIeName);
//------------------------------------------------------------------------------
PDU_Session_Reactivation_Result::PDU_Session_Reactivation_Result() {
_iei = 0;
_value = 0;
length = 0;
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
PDU_Session_Reactivation_Result::~PDU_Session_Reactivation_Result() {} PDU_Session_Reactivation_Result::~PDU_Session_Reactivation_Result() {}
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
void PDU_Session_Reactivation_Result::setValue(uint8_t iei, uint16_t value) { void PDU_Session_Reactivation_Result::setValue(uint16_t value) {
_iei = iei;
_value = value; _value = value;
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
uint16_t PDU_Session_Reactivation_Result::getValue() { uint16_t PDU_Session_Reactivation_Result::getValue() const {
return _value; return _value;
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
int PDU_Session_Reactivation_Result::Encode(uint8_t* buf, int len) { int PDU_Session_Reactivation_Result::Encode(uint8_t* buf, int len) {
Logger::nas_mm().debug( Logger::nas_mm().debug("Encoding %s", GetIeName().c_str());
"encoding PDU_Session_Reactivation_Result iei(0x%x)", _iei); int ie_len = GetIeLength();
if (len < length) {
Logger::nas_mm().error("len is less than %d", length); if (len < ie_len) {
return 0; Logger::nas_mm().error("Len is less than %d", ie_len);
return KEncodeDecodeError;
} }
int encoded_size = 0; int encoded_size = 0;
if (_iei) { // IEI and Length
*(buf + encoded_size) = _iei; int encoded_header_size = Type4NasIe::Encode(buf + encoded_size, len);
encoded_size++; if (encoded_header_size == KEncodeDecodeError) return KEncodeDecodeError;
*(buf + encoded_size) = length - 2; encoded_size += encoded_header_size;
encoded_size++;
*(buf + encoded_size) = (_value & 0x00ff); // Octet 3
encoded_size++; ENCODE_U16(buf + encoded_size, _value, encoded_size);
*(buf + encoded_size) = (_value & 0xff00) >> 8; // TODO: Encode spare for the rest
encoded_size++; uint8_t spare = 0;
} else { int spare_len = ie_len - encoded_size;
//*(buf + encoded_size) = length - 1; encoded_size++; for (int i = 0; i < spare_len; i++) {
//*(buf + encoded_size) = _value; encoded_size++; encoded_size++; ENCODE_U8(buf + encoded_size, spare, encoded_size);
} }
Logger::nas_mm().debug( Logger::nas_mm().debug(
"encoded PDU_Session_Reactivation_Result len(%d)", encoded_size); "Encoded %s, len (%d)", GetIeName().c_str(), encoded_size);
return encoded_size; return encoded_size;
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
int PDU_Session_Reactivation_Result::Decode( int PDU_Session_Reactivation_Result::Decode(
uint8_t* buf, int len, bool is_option) { uint8_t* buf, int len, bool is_iei) {
Logger::nas_mm().debug( if (len < kPduSessionReactivationResultMinimumLength) {
"decoding PDU_Session_Reactivation_Result iei(0x%x)", *buf); Logger::nas_mm().error(
int decoded_size = 0; "Buffer length is less than the minimum length of this IE (%d octet)",
if (is_option) { kPduSessionReactivationResultMinimumLength);
decoded_size++; return KEncodeDecodeError;
} }
_value = 0x0000;
length = *(buf + decoded_size); uint8_t decoded_size = 0;
decoded_size++; uint8_t octet = 0;
_value |= *(buf + decoded_size); Logger::nas_mm().debug("Decoding %s", GetIeName().c_str());
decoded_size++;
_value |= (*(buf + decoded_size)) << 8; // IEI and Length
decoded_size++; int decoded_header_size = Type4NasIe::Decode(buf + decoded_size, len, is_iei);
// decoded_size += Type4NasIe::Decode(buf + decoded_size, len, is_iei);
if (decoded_header_size == KEncodeDecodeError) return KEncodeDecodeError;
decoded_size += decoded_header_size;
// Value
DECODE_U16(buf + decoded_size, _value, decoded_size);
// TODO: decode the rest as spare for now
uint8_t spare = 0;
for (int i = 0; i < (GetLengthIndicator() - 2); i++) {
DECODE_U8(buf + decoded_size, spare, decoded_size);
}
Logger::nas_mm().debug( Logger::nas_mm().debug(
"decoded PDU_Session_Reactivation_Result value(0x%4x)", _value); "Decoded %s, Value (0x%x)", GetIeName().c_str(), _value);
Logger::nas_mm().debug( Logger::nas_mm().debug(
"decoded PDU_Session_Reactivation_Result len(%d)", decoded_size); "Decoded %s, len (%d)", GetIeName().c_str(), decoded_size);
return decoded_size; return decoded_size;
} }
...@@ -18,36 +18,34 @@ ...@@ -18,36 +18,34 @@
* For more information about the OpenAirInterface (OAI) Software Alliance: * For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org * contact@openairinterface.org
*/ */
#ifndef _PDU_SESSION_REACTIVATION_RESULT_H_
#define _PDU_SESSION_REACTIVATION_RESULT_H_
/*! \file #include "Type4NasIe.hpp"
\brief
\author Keliang DU, BUPT
\date 2020
\email: contact@openairinterface.org
*/
#ifndef __PDU_Session_Reactivation_Result_H_
#define __PDU_Session_Reactivation_Result_H_
#include <stdint.h> #include <stdint.h>
constexpr uint8_t kPduSessionReactivationResultMinimumLength = 4;
constexpr uint8_t kPduSessionReactivationResultMaximumLength = 34;
constexpr auto kPduSessionReactivationResultIeName =
"PDU Session Reactivation Result";
namespace nas { namespace nas {
class PDU_Session_Reactivation_Result { class PDU_Session_Reactivation_Result : public Type4NasIe {
public: public:
PDU_Session_Reactivation_Result(); PDU_Session_Reactivation_Result();
PDU_Session_Reactivation_Result(uint8_t iei); PDU_Session_Reactivation_Result(uint16_t value);
PDU_Session_Reactivation_Result(const uint8_t iei, uint16_t value);
~PDU_Session_Reactivation_Result(); ~PDU_Session_Reactivation_Result();
void setValue(uint8_t iei, uint16_t value);
void setValue(uint16_t value);
uint16_t getValue() const;
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);
uint16_t getValue();
private: private:
uint8_t _iei;
uint8_t length;
uint16_t _value; uint16_t _value;
// Spare
}; };
} // namespace nas } // namespace nas
......
...@@ -19,101 +19,127 @@ ...@@ -19,101 +19,127 @@
* contact@openairinterface.org * contact@openairinterface.org
*/ */
/*! \file __5GS_Network_Feature_Support.cpp
\brief
\author Keliang DU, BUPT
\date 2020
\email: contact@openairinterface.org
*/
#include "_5GS_Network_Feature_Support.hpp" #include "_5GS_Network_Feature_Support.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;
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
_5GS_Network_Feature_Support::_5GS_Network_Feature_Support(uint8_t iei) { _5GS_Network_Feature_Support::_5GS_Network_Feature_Support()
_iei = iei; : Type4NasIe(kIei5gsNetworkFeatureSupport) {
_value = 0; _value = 0;
_value2 = 0; _value2 = 0;
length = 0; SetLengthIndicator(1); // With mimimum length of 3
SetIeName(k5gsNetworkFeatureSupportIeName);
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
_5GS_Network_Feature_Support::_5GS_Network_Feature_Support() { _5GS_Network_Feature_Support::_5GS_Network_Feature_Support(uint8_t value)
_iei = 0; : Type4NasIe(kIei5gsNetworkFeatureSupport) {
_value = 0; _value = value;
_value2 = 0; _value2 = 0;
length = 0; SetLengthIndicator(1); // With mimimum length of 3
SetIeName(k5gsNetworkFeatureSupportIeName);
} }
//------------------------------------------------------------------------------
_5GS_Network_Feature_Support::~_5GS_Network_Feature_Support() {}
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
_5GS_Network_Feature_Support::_5GS_Network_Feature_Support( _5GS_Network_Feature_Support::_5GS_Network_Feature_Support(
const uint8_t iei, uint8_t value, uint8_t value2) { uint8_t value, uint8_t value2)
_iei = iei; : Type4NasIe(kIei5gsNetworkFeatureSupport) {
_value = value; _value = value;
_value2 = value2; _value2 = value2;
length = 4; SetLengthIndicator(2);
SetIeName(k5gsNetworkFeatureSupportIeName);
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
void _5GS_Network_Feature_Support::setValue(uint8_t value) { _5GS_Network_Feature_Support::~_5GS_Network_Feature_Support() {}
_value = value;
//------------------------------------------------------------------------------
void _5GS_Network_Feature_Support::setValue(uint8_t value, uint8_t value2) {
_value = value;
_value2 = value2;
} }
/*
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
uint8_t _5GS_Network_Feature_Support::getValue() { uint8_t _5GS_Network_Feature_Support::getValue() {
return _value; return _value;
} }
*/
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
int _5GS_Network_Feature_Support::Encode(uint8_t* buf, int len) { int _5GS_Network_Feature_Support::Encode(uint8_t* buf, int len) {
Logger::nas_mm().debug( Logger::nas_mm().debug("Encoding %s", GetIeName().c_str());
"Encoding _5GS_Network_Feature_Support IEI (0x%x)", _iei); int ie_len = GetIeLength();
if (len < length) {
Logger::nas_mm().error("len is less than %d", length); if (len < ie_len) {
return 0; Logger::nas_mm().error("Len is less than %d", ie_len);
return KEncodeDecodeError;
} }
int encoded_size = 0; int encoded_size = 0;
if (_iei) { // IEI and Length
*(buf + encoded_size) = _iei; int encoded_header_size = Type4NasIe::Encode(buf + encoded_size, len);
encoded_size++; if (encoded_header_size == KEncodeDecodeError) return KEncodeDecodeError;
*(buf + encoded_size) = length - 2; encoded_size += encoded_header_size;
encoded_size++;
*(buf + encoded_size) = _value; // Octet 3
encoded_size++; ENCODE_U8(buf + encoded_size, _value, encoded_size);
*(buf + encoded_size) = _value2;
encoded_size++; // Octet 4
} else { if (GetIeLength() > encoded_size)
*(buf + encoded_size) = length - 1; ENCODE_U8(buf + encoded_size, _value2, encoded_size);
encoded_size++;
// *(buf + encoded_size) = _5g_ea_; encoded_size++; // Spare
// *(buf + encoded_size) = _5g_ia_; encoded_size++; if (GetIeLength() > encoded_size) {
uint8_t spare = 0;
ENCODE_U8(buf + encoded_size, spare, encoded_size);
} }
Logger::nas_mm().debug( Logger::nas_mm().debug(
"Encoded _5GS_Network_Feature_Support len (%d)", encoded_size); "Encoded %s, len (%d)", GetIeName().c_str(), encoded_size);
return encoded_size; return encoded_size;
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
int _5GS_Network_Feature_Support::Decode( int _5GS_Network_Feature_Support::Decode(uint8_t* buf, int len, bool is_iei) {
uint8_t* buf, int len, bool is_option) { if (len < k5gsNetworkFeatureSupportMinimumLength) {
Logger::nas_mm().debug( Logger::nas_mm().error(
"Decoding _5GS_Network_Feature_Support IEI (0x%x)", *buf); "Buffer length is less than the minimum length of this IE (%d octet)",
int decoded_size = 0; k5gsNetworkFeatureSupportMinimumLength);
if (is_option) { return KEncodeDecodeError;
decoded_size++;
} }
length = *(buf + decoded_size);
decoded_size++; uint8_t decoded_size = 0;
_value = *(buf + decoded_size); uint8_t octet = 0;
decoded_size++; Logger::nas_mm().debug("Decoding %s", GetIeName().c_str());
// IEI and Length
int decoded_header_size = Type4NasIe::Decode(buf + decoded_size, len, is_iei);
if (decoded_header_size == KEncodeDecodeError) return KEncodeDecodeError;
decoded_size += decoded_header_size;
// Octet 3
DECODE_U8(buf + decoded_size, _value, decoded_size);
// Octet 4
if (GetLengthIndicator() > 1) {
DECODE_U8(buf + decoded_size, _value2, decoded_size);
}
// Spare
if (GetLengthIndicator() > 2) {
uint8_t spare = 0;
DECODE_U8(buf + decoded_size, spare, decoded_size);
}
Logger::nas_mm().debug( Logger::nas_mm().debug(
"Decoded _5GS_Network_Feature_Support value (0x%x)", _value); "Decoded %s, value (0x%x)", GetIeName().c_str(), _value);
Logger::nas_mm().debug( Logger::nas_mm().debug(
"Decoded _5GS_Network_Feature_Support len (%d)", decoded_size); "Decoded %s, len (%d)", GetIeName().c_str(), decoded_size);
return decoded_size; return decoded_size;
} }
...@@ -19,37 +19,35 @@ ...@@ -19,37 +19,35 @@
* contact@openairinterface.org * contact@openairinterface.org
*/ */
/*! \file __5GS_Network_Feature_Support.hpp #ifndef _5GS_NETWORK_FEATURE_SUPPORT_H
\brief #define _5GS_NETWORK_FEATURE_SUPPORT_H
\author Keliang DU, BUPT
\date 2020
\email: contact@openairinterface.org
*/
#ifndef __5GS_Network_Feature_Support_H
#define __5GS_Network_Feature_Support_H
#include "Type4NasIe.hpp"
#include <stdint.h> #include <stdint.h>
constexpr uint8_t k5gsNetworkFeatureSupportMinimumLength = 3;
constexpr uint8_t k5gsNetworkFeatureSupportMaximumLength = 5;
constexpr auto k5gsNetworkFeatureSupportIeName = "5GS Network Feature Support";
namespace nas { namespace nas {
class _5GS_Network_Feature_Support { class _5GS_Network_Feature_Support : public Type4NasIe {
public: public:
_5GS_Network_Feature_Support(uint8_t iei);
_5GS_Network_Feature_Support(); _5GS_Network_Feature_Support();
_5GS_Network_Feature_Support(uint8_t value);
_5GS_Network_Feature_Support(uint8_t value, uint8_t value2);
~_5GS_Network_Feature_Support(); ~_5GS_Network_Feature_Support();
_5GS_Network_Feature_Support(
const uint8_t iei, uint8_t value, uint8_t value2); void setValue(uint8_t value, uint8_t value2);
void setValue(uint8_t value); // uint8_t getValue() const;
uint8_t getValue();
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_option);
private: private:
uint8_t _iei;
uint8_t length;
uint8_t _value; uint8_t _value;
uint8_t _value2; uint8_t _value2;
// Spare
}; };
} // namespace nas } // namespace nas
......
...@@ -166,7 +166,7 @@ void RegistrationAccept::setCONFIGURED_NSSAI( ...@@ -166,7 +166,7 @@ void RegistrationAccept::setCONFIGURED_NSSAI(
void RegistrationAccept::set_5GS_Network_Feature_Support( void RegistrationAccept::set_5GS_Network_Feature_Support(
uint8_t value, uint8_t value2) { uint8_t value, uint8_t value2) {
ie_5gs_network_feature_support = ie_5gs_network_feature_support =
std::make_optional<_5GS_Network_Feature_Support>(0x21, value, value2); std::make_optional<_5GS_Network_Feature_Support>(value, value2);
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
...@@ -177,7 +177,7 @@ void RegistrationAccept::setPDU_session_status(uint16_t value) { ...@@ -177,7 +177,7 @@ void RegistrationAccept::setPDU_session_status(uint16_t value) {
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
void RegistrationAccept::setPDU_session_reactivation_result(uint16_t value) { void RegistrationAccept::setPDU_session_reactivation_result(uint16_t value) {
ie_pdu_session_reactivation_result = ie_pdu_session_reactivation_result =
std::make_optional<PDU_Session_Reactivation_Result>(0x26, value); std::make_optional<PDU_Session_Reactivation_Result>(value);
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
...@@ -433,6 +433,7 @@ int RegistrationAccept::Encode(uint8_t* buf, int len) { ...@@ -433,6 +433,7 @@ int RegistrationAccept::Encode(uint8_t* buf, int len) {
return 0; return 0;
} }
} }
/*
if (!ie_ladn_information.has_value()) { if (!ie_ladn_information.has_value()) {
Logger::nas_mm().warn("IE ie_ladn_information is not available"); Logger::nas_mm().warn("IE ie_ladn_information is not available");
} else { } else {
...@@ -443,7 +444,7 @@ int RegistrationAccept::Encode(uint8_t* buf, int len) { ...@@ -443,7 +444,7 @@ int RegistrationAccept::Encode(uint8_t* buf, int len) {
Logger::nas_mm().error("encoding ie_ladn_information error"); Logger::nas_mm().error("encoding ie_ladn_information error");
return 0; return 0;
} }
} }*/
if (!ie_MICO_indication.has_value()) { if (!ie_MICO_indication.has_value()) {
Logger::nas_mm().warn("IE ie_MICO_indication is not available"); Logger::nas_mm().warn("IE ie_MICO_indication is not available");
} else { } else {
...@@ -750,8 +751,9 @@ int RegistrationAccept::Decode(uint8_t* buf, int len) { ...@@ -750,8 +751,9 @@ int RegistrationAccept::Decode(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 0x26: { case kIeiPduSessionReactivationResult: {
Logger::nas_mm().debug("Decoding IEI (0x26)"); Logger::nas_mm().debug(
"Decoding IEI 0x%x", kIeiPduSessionReactivationResult);
PDU_Session_Reactivation_Result ie_pdu_session_reactivation_result_tmp = PDU_Session_Reactivation_Result ie_pdu_session_reactivation_result_tmp =
{}; {};
decoded_size += ie_pdu_session_reactivation_result_tmp.Decode( decoded_size += ie_pdu_session_reactivation_result_tmp.Decode(
......
...@@ -155,8 +155,7 @@ class RegistrationAccept : public NasMmPlainHeader { ...@@ -155,8 +155,7 @@ class RegistrationAccept : public NasMmPlainHeader {
std::optional<Rejected_NSSAI> ie_rejected_nssai; // Optional std::optional<Rejected_NSSAI> ie_rejected_nssai; // Optional
std::optional<NSSAI> ie_configured_nssai; // Optional std::optional<NSSAI> ie_configured_nssai; // Optional
std::optional<_5GS_Network_Feature_Support> std::optional<_5GS_Network_Feature_Support>
ie_5gs_network_feature_support; // Optional ie_5gs_network_feature_support; // Optional
std::optional<PDUSessionStatus> ie_PDU_session_status; // Optional std::optional<PDUSessionStatus> ie_PDU_session_status; // Optional
std::optional<PDU_Session_Reactivation_Result> std::optional<PDU_Session_Reactivation_Result>
ie_pdu_session_reactivation_result; // Optional ie_pdu_session_reactivation_result; // Optional
......
...@@ -57,8 +57,7 @@ void ServiceAccept::setPDU_session_status(uint16_t value) { ...@@ -57,8 +57,7 @@ void ServiceAccept::setPDU_session_status(uint16_t value) {
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
void ServiceAccept::setPDU_session_reactivation_result(uint16_t value) { void ServiceAccept::setPDU_session_reactivation_result(uint16_t value) {
ie_session_reactivation_result = ie_session_reactivation_result = new PDU_Session_Reactivation_Result(value);
new PDU_Session_Reactivation_Result(0x26, value);
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
......
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