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

Update UplinkDataStatus and UENetworkCapability

parent af00930c
...@@ -1414,9 +1414,10 @@ void amf_n1::registration_request_handle( ...@@ -1414,9 +1414,10 @@ void amf_n1::registration_request_handle(
case MOBILITY_REGISTRATION_UPDATING: { case MOBILITY_REGISTRATION_UPDATING: {
Logger::amf_n1().debug("Handling Mobility Registration Update..."); Logger::amf_n1().debug("Handling Mobility Registration Update...");
uint16_t uplink_data_status = 0;
registration_request->getUplinkDataStatus(uplink_data_status);
run_mobility_registration_update_procedure( run_mobility_registration_update_procedure(
nc, registration_request->getUplinkDataStatus(), nc, uplink_data_status, registration_request->getPduSessionStatus());
registration_request->getPduSessionStatus());
} break; } break;
case PERIODIC_REGISTRATION_UPDATING: { case PERIODIC_REGISTRATION_UPDATING: {
......
...@@ -53,6 +53,7 @@ class UENetworkCapability { ...@@ -53,6 +53,7 @@ class UENetworkCapability {
// TODO: uint8_t octet_7; // TODO: uint8_t octet_7;
// TODO: uint8_t octet_8; // TODO: uint8_t octet_8;
// TODO: uint8_t octet_9; // TODO: uint8_t octet_9;
// TODO: spare octet 10-15
}; };
} // namespace nas } // namespace nas
......
...@@ -19,15 +19,10 @@ ...@@ -19,15 +19,10 @@
* contact@openairinterface.org * contact@openairinterface.org
*/ */
/*! \file
\brief
\author Keliang DU, BUPT
\date 2020
\email: contact@openairinterface.org
*/
#include "UplinkDataStatus.hpp" #include "UplinkDataStatus.hpp"
#include "3gpp_24.501.hpp"
#include "common_defs.h"
#include "logger.hpp" #include "logger.hpp"
using namespace nas; using namespace nas;
...@@ -39,10 +34,10 @@ UplinkDataStatus::UplinkDataStatus(uint8_t iei) { ...@@ -39,10 +34,10 @@ UplinkDataStatus::UplinkDataStatus(uint8_t iei) {
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
UplinkDataStatus::UplinkDataStatus(const uint8_t iei, uint16_t value) { UplinkDataStatus::UplinkDataStatus(const uint8_t& iei, const uint16_t& value) {
_iei = iei; _iei = iei;
_value = value; _value = value;
length = 4; length = 2;
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
...@@ -68,43 +63,37 @@ uint16_t UplinkDataStatus::getValue() { ...@@ -68,43 +63,37 @@ uint16_t UplinkDataStatus::getValue() {
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
int UplinkDataStatus::encode2Buffer(uint8_t* buf, int len) { int UplinkDataStatus::encode2Buffer(uint8_t* buf, int len) {
Logger::nas_mm().debug("encoding UplinkDataStatus iei(0x%x)", _iei); Logger::nas_mm().debug("Encoding UplinkDataStatus IEI (0x%x)", _iei);
if (len < length) { if (len < kUplinkDataStatusMinimumLength) {
Logger::nas_mm().error("len is less than %d", length); Logger::nas_mm().error(
return 0; "Buffer length is less than the minimum length of this IE (%d octet)",
kUplinkDataStatusMinimumLength);
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 & 0xff00) >> 8;
encoded_size++;
*(buf + encoded_size) = _value & 0x00ff;
encoded_size++;
} else {
// *(buf + encoded_size) = length - 1; encoded_size++;
// *(buf + encoded_size) = _value; encoded_size++; encoded_size++;
} }
Logger::nas_mm().debug("encoded UplinkDataStatus 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 UplinkDataStatus, size (%d)", encoded_size);
return encoded_size; return encoded_size;
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
int UplinkDataStatus::decodeFromBuffer(uint8_t* buf, int len, bool is_option) { int UplinkDataStatus::decodeFromBuffer(uint8_t* buf, int len, bool is_option) {
Logger::nas_mm().debug("decoding UplinkDataStatus iei(0x%x)", *buf); Logger::nas_mm().debug("Decoding UplinkDataStatus");
int decoded_size = 0; int decoded_size = 0;
if (is_option) { if (is_option) {
decoded_size++; DECODE_U8(buf + decoded_size, _iei, decoded_size);
} }
length = *(buf + decoded_size); DECODE_U8(buf + decoded_size, length, decoded_size);
decoded_size++; DECODE_U16(buf + decoded_size, _value, decoded_size);
_value = *(buf + decoded_size) << 8;
decoded_size++; Logger::nas_mm().debug(
_value |= *(buf + decoded_size); "Decoded UplinkDataStatus value 0x%x, len %d", _value, decoded_size);
decoded_size++;
Logger::nas_mm().debug("decoded UplinkDataStatus value(0x%4x)", _value);
Logger::nas_mm().debug("decoded UplinkDataStatus len(%d)", decoded_size);
return decoded_size; return decoded_size;
} }
...@@ -19,25 +19,21 @@ ...@@ -19,25 +19,21 @@
* contact@openairinterface.org * contact@openairinterface.org
*/ */
/*! \file
\brief
\author Keliang DU, BUPT
\date 2020
\email: contact@openairinterface.org
*/
#ifndef __UplinkDataStatus_H_ #ifndef __UplinkDataStatus_H_
#define __UplinkDataStatus_H_ #define __UplinkDataStatus_H_
#include <stdint.h> #include <stdint.h>
constexpr uint8_t kUplinkDataStatusMinimumLength = 4;
constexpr uint8_t kUplinkDataStatusMaximumLength = 34;
namespace nas { namespace nas {
class UplinkDataStatus { class UplinkDataStatus {
public: public:
UplinkDataStatus(); UplinkDataStatus();
UplinkDataStatus(uint8_t); UplinkDataStatus(uint8_t);
UplinkDataStatus(const uint8_t iei, uint16_t value); UplinkDataStatus(const uint8_t& iei, const uint16_t& value);
~UplinkDataStatus(); ~UplinkDataStatus();
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);
...@@ -48,6 +44,7 @@ class UplinkDataStatus { ...@@ -48,6 +44,7 @@ class UplinkDataStatus {
uint8_t _iei; uint8_t _iei;
uint8_t length; uint8_t length;
uint16_t _value; uint16_t _value;
// TODO: spare
}; };
} // namespace nas } // namespace nas
......
...@@ -34,9 +34,9 @@ RegistrationRequest::RegistrationRequest() ...@@ -34,9 +34,9 @@ RegistrationRequest::RegistrationRequest()
ie_5g_mm_capability = std::nullopt; ie_5g_mm_capability = std::nullopt;
ie_ue_security_capability = std::nullopt; ie_ue_security_capability = std::nullopt;
ie_requested_NSSAI = std::nullopt; ie_requested_NSSAI = std::nullopt;
ie_s1_ue_network_capability = nullptr; ie_s1_ue_network_capability = std::nullopt;
ie_uplink_data_status = nullptr; ie_uplink_data_status = std::nullopt;
ie_last_visited_registered_TAI = nullptr; ie_last_visited_registered_TAI = std::nullopt;
ie_PDU_session_status = nullptr; ie_PDU_session_status = nullptr;
ie_MICO_indicationl = nullptr; ie_MICO_indicationl = nullptr;
ie_ue_status = nullptr; ie_ue_status = nullptr;
...@@ -271,22 +271,22 @@ bool RegistrationRequest::getRequestedNssai( ...@@ -271,22 +271,22 @@ bool RegistrationRequest::getRequestedNssai(
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
void RegistrationRequest::setLast_Visited_Registered_TAI( void RegistrationRequest::setLast_Visited_Registered_TAI(
const std::string& mcc, const std::string mnc, const uint32_t& tac) { const std::string& mcc, const std::string mnc, const uint32_t& tac) {
// TODO: ie_last_visited_registered_TAI = ie_last_visited_registered_TAI =
// new _5GSTrackingAreaIdentity(mcc, mnc, tac); std::make_optional<_5GSTrackingAreaIdentity>(0, mcc, mnc, tac);
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
void RegistrationRequest::setUENetworkCapability( void RegistrationRequest::setUENetworkCapability(
uint8_t g_EEASel, uint8_t g_EIASel) { uint8_t g_EEASel, uint8_t g_EIASel) {
ie_s1_ue_network_capability = ie_s1_ue_network_capability =
new UENetworkCapability(0x17, g_EEASel, g_EIASel); std::make_optional<UENetworkCapability>(0x17, g_EEASel, g_EIASel);
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
bool RegistrationRequest::getS1UeNetworkCapability(uint8_t& eea, uint8_t& eia) { bool RegistrationRequest::getS1UeNetworkCapability(uint8_t& eea, uint8_t& eia) {
if (ie_s1_ue_network_capability) { if (ie_s1_ue_network_capability.has_value()) {
eea = ie_s1_ue_network_capability->getEEASel(); eea = ie_s1_ue_network_capability.value().getEEASel();
eia = ie_s1_ue_network_capability->getEIASel(); eia = ie_s1_ue_network_capability.value().getEIASel();
} else { } else {
return false; return false;
} }
...@@ -294,16 +294,17 @@ bool RegistrationRequest::getS1UeNetworkCapability(uint8_t& eea, uint8_t& eia) { ...@@ -294,16 +294,17 @@ bool RegistrationRequest::getS1UeNetworkCapability(uint8_t& eea, uint8_t& eia) {
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
void RegistrationRequest::setUplink_data_status(uint16_t value) { void RegistrationRequest::setUplink_data_status(const uint16_t& value) {
ie_uplink_data_status = new UplinkDataStatus(0x40, value); ie_uplink_data_status = std::make_optional<UplinkDataStatus>(0x40, value);
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
uint16_t RegistrationRequest::getUplinkDataStatus() { bool RegistrationRequest::getUplinkDataStatus(uint16_t& value) {
if (ie_uplink_data_status) { if (ie_uplink_data_status.has_value()) {
return ie_uplink_data_status->getValue(); value = ie_uplink_data_status.value().getValue();
return true;
} else { } else {
return 0; return false;
} }
} }
...@@ -622,10 +623,10 @@ int RegistrationRequest::encode2Buffer(uint8_t* buf, int len) { ...@@ -622,10 +623,10 @@ int RegistrationRequest::encode2Buffer(uint8_t* buf, int len) {
} }
// Last visited registered TAI // Last visited registered TAI
if (!ie_last_visited_registered_TAI) { if (!ie_last_visited_registered_TAI.has_value()) {
Logger::nas_mm().warn("IE ie_Last_visited_registered_TAI is not available"); Logger::nas_mm().warn("IE ie_Last_visited_registered_TAI is not available");
} else { } else {
if (int size = ie_last_visited_registered_TAI->encode2Buffer( if (int size = ie_last_visited_registered_TAI.value().encode2Buffer(
buf + encoded_size, len - encoded_size)) { buf + encoded_size, len - encoded_size)) {
encoded_size += size; encoded_size += size;
} else { } else {
...@@ -635,10 +636,10 @@ int RegistrationRequest::encode2Buffer(uint8_t* buf, int len) { ...@@ -635,10 +636,10 @@ int RegistrationRequest::encode2Buffer(uint8_t* buf, int len) {
} }
// S1 UE network capability // S1 UE network capability
if (!ie_s1_ue_network_capability) { if (!ie_s1_ue_network_capability.has_value()) {
Logger::nas_mm().warn("IE ie_s1_ue_network_capability is not available"); Logger::nas_mm().warn("IE ie_s1_ue_network_capability is not available");
} else { } else {
if (int size = ie_s1_ue_network_capability->encode2Buffer( if (int size = ie_s1_ue_network_capability.value().encode2Buffer(
buf + encoded_size, len - encoded_size)) { buf + encoded_size, len - encoded_size)) {
encoded_size += size; encoded_size += size;
} else { } else {
...@@ -646,10 +647,10 @@ int RegistrationRequest::encode2Buffer(uint8_t* buf, int len) { ...@@ -646,10 +647,10 @@ int RegistrationRequest::encode2Buffer(uint8_t* buf, int len) {
return 0; return 0;
} }
} }
if (!ie_uplink_data_status) { if (!ie_uplink_data_status.has_value()) {
Logger::nas_mm().warn("IE ie_uplink_data_status is not available"); Logger::nas_mm().warn("IE ie_uplink_data_status is not available");
} else { } else {
if (int size = ie_uplink_data_status->encode2Buffer( if (int size = ie_uplink_data_status.value().encode2Buffer(
buf + encoded_size, len - encoded_size)) { buf + encoded_size, len - encoded_size)) {
encoded_size += size; encoded_size += size;
} else { } else {
...@@ -927,25 +928,32 @@ int RegistrationRequest::decodeFromBuffer(uint8_t* buf, int len) { ...@@ -927,25 +928,32 @@ int RegistrationRequest::decodeFromBuffer(uint8_t* buf, int len) {
} break; } break;
case 0x52: { case 0x52: {
Logger::nas_mm().debug("Decoding IEI(0x52)"); Logger::nas_mm().debug("Decoding IEI(0x52)");
ie_last_visited_registered_TAI = new _5GSTrackingAreaIdentity(); _5GSTrackingAreaIdentity last_visited_registered_tai_tmp = {};
decoded_size += ie_last_visited_registered_TAI->decodeFromBuffer( decoded_size += last_visited_registered_tai_tmp.decodeFromBuffer(
buf + decoded_size, len - decoded_size, true); buf + decoded_size, len - decoded_size, true);
ie_last_visited_registered_TAI =
std::optional<_5GSTrackingAreaIdentity>(
last_visited_registered_tai_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;
case 0x17: { case 0x17: {
Logger::nas_mm().debug("Decoding IEI (0x17)"); Logger::nas_mm().debug("Decoding IEI (0x17)");
ie_s1_ue_network_capability = new UENetworkCapability(); UENetworkCapability ie_s1_ue_network_capability_tmp = {};
decoded_size += ie_s1_ue_network_capability->decodeFromBuffer( decoded_size += ie_s1_ue_network_capability_tmp.decodeFromBuffer(
buf + decoded_size, len - decoded_size, true); buf + decoded_size, len - decoded_size, true);
ie_s1_ue_network_capability =
std::optional<UENetworkCapability>(ie_s1_ue_network_capability_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;
case 0x40: { case 0x40: {
Logger::nas_mm().debug("Decoding IEI(0x40)"); Logger::nas_mm().debug("Decoding IEI(0x40)");
ie_uplink_data_status = new UplinkDataStatus(); UplinkDataStatus ie_uplink_data_status_tmp = {};
decoded_size += ie_uplink_data_status->decodeFromBuffer( decoded_size += ie_uplink_data_status_tmp.decodeFromBuffer(
buf + decoded_size, len - decoded_size, true); buf + decoded_size, len - decoded_size, true);
ie_uplink_data_status =
std::optional<UplinkDataStatus>(ie_uplink_data_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);
......
...@@ -91,8 +91,8 @@ class RegistrationRequest : public NasMmPlainHeader { ...@@ -91,8 +91,8 @@ class RegistrationRequest : public NasMmPlainHeader {
void setUENetworkCapability(uint8_t g_EEASel, uint8_t g_EIASel); void setUENetworkCapability(uint8_t g_EEASel, uint8_t g_EIASel);
bool getS1UeNetworkCapability(uint8_t& eea, uint8_t& eia); bool getS1UeNetworkCapability(uint8_t& eea, uint8_t& eia);
void setUplink_data_status(uint16_t value); void setUplink_data_status(const uint16_t& value);
uint16_t getUplinkDataStatus(); bool getUplinkDataStatus(uint16_t& value);
void setLast_Visited_Registered_TAI( void setLast_Visited_Registered_TAI(
const std::string& mcc, const std::string mnc, const uint32_t& tac); const std::string& mcc, const std::string mnc, const uint32_t& tac);
...@@ -156,10 +156,11 @@ class RegistrationRequest : public NasMmPlainHeader { ...@@ -156,10 +156,11 @@ class RegistrationRequest : public NasMmPlainHeader {
std::optional<_5GMMCapability> ie_5g_mm_capability; // Optional std::optional<_5GMMCapability> ie_5g_mm_capability; // Optional
std::optional<UESecurityCapability> ie_ue_security_capability; // Optional std::optional<UESecurityCapability> ie_ue_security_capability; // Optional
std::optional<NSSAI> ie_requested_NSSAI; // Optional std::optional<NSSAI> ie_requested_NSSAI; // Optional
std::optional<_5GSTrackingAreaIdentity>
ie_last_visited_registered_TAI; // Optional
std::optional<UENetworkCapability> ie_s1_ue_network_capability; // Optional
std::optional<UplinkDataStatus> ie_uplink_data_status; // Optional
_5GSTrackingAreaIdentity* ie_last_visited_registered_TAI; // Optional
UENetworkCapability* ie_s1_ue_network_capability; // Optional
UplinkDataStatus* ie_uplink_data_status; // Optional
PDU_Session_Status* 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
......
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