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

Update PDU Session Reactivation Result Error Cause

parent b6cd3332
...@@ -120,13 +120,14 @@ constexpr uint8_t kT3346Value = 0x5f; ...@@ -120,13 +120,14 @@ constexpr uint8_t kT3346Value = 0x5f;
constexpr uint8_t kIeiEpsBearerContextStatus = 0x60; constexpr uint8_t kIeiEpsBearerContextStatus = 0x60;
constexpr uint8_t kIeiRejectedNssaiRr = 0x69; constexpr uint8_t kIeiRejectedNssaiRr = 0x69;
constexpr uint8_t kIeiEpsNasMessageContainer = 0x70; constexpr uint8_t kIeiEpsNasMessageContainer = 0x70;
constexpr uint8_t kIeiNasMessageContainer = 0x71; constexpr uint8_t kIeiNasMessageContainer = 0x71;
constexpr uint8_t kIeiLadnIndication = 0x74; constexpr uint8_t kIeiPduSessionReactivationResultErrorCause = 0x72;
constexpr uint8_t kIeiLadnInformation = 0x79; constexpr uint8_t kIeiLadnIndication = 0x74;
constexpr uint8_t kIei5gGuti = 0x77; constexpr uint8_t kIeiLadnInformation = 0x79;
constexpr uint8_t kIeiImeisv = 0x77; constexpr uint8_t kIei5gGuti = 0x77;
constexpr uint8_t kIeiNonImeisvPei = 0x78; constexpr uint8_t kIeiImeisv = 0x77;
constexpr uint8_t kIeiNonImeisvPei = 0x78;
constexpr uint8_t kIeiEapMessage = 0x78; constexpr uint8_t kIeiEapMessage = 0x78;
constexpr uint8_t kIeiPayloadContainer = 0x7b; constexpr uint8_t kIeiPayloadContainer = 0x7b;
...@@ -19,116 +19,133 @@ ...@@ -19,116 +19,133 @@
* contact@openairinterface.org * contact@openairinterface.org
*/ */
/*! \file
\brief
\author Keliang DU, BUPT
\date 2020
\email: contact@openairinterface.org
*/
#include "PDU_Session_Reactivation_Result_Error_Cause.hpp" #include "PDU_Session_Reactivation_Result_Error_Cause.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_Error_Cause:: PDU_Session_Reactivation_Result_Error_Cause::
PDU_Session_Reactivation_Result_Error_Cause(uint8_t iei) { PDU_Session_Reactivation_Result_Error_Cause()
_iei = iei; : Type6NasIe(kIeiPduSessionReactivationResultErrorCause),
_value = 0; pdu_session_id_cause_value_pair() {
SESSION_ID = 0; std::pair<uint8_t, uint8_t> value = std::make_pair<uint8_t, uint8_t>(0, 0);
length = 0; pdu_session_id_cause_value_pair.push_back(value);
SetLengthIndicator(
2); // Minimum length with 1 pair (PDU Session ID, Cause Value)
SetIeName(kPduSessionReactivationResultErrorCauseIeName);
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
PDU_Session_Reactivation_Result_Error_Cause:: PDU_Session_Reactivation_Result_Error_Cause::
PDU_Session_Reactivation_Result_Error_Cause( PDU_Session_Reactivation_Result_Error_Cause(
const uint8_t iei, uint8_t session_id, uint8_t value) { uint8_t session_id, uint8_t cause)
_iei = iei; : Type6NasIe(kIeiPduSessionReactivationResultErrorCause) {
_value = value; std::pair<uint8_t, uint8_t> value = std::make_pair(session_id, cause);
SESSION_ID = session_id; pdu_session_id_cause_value_pair.push_back(value);
length = 5; SetLengthIndicator(
2); // Minimum length with 1 pair (PDU Session ID, Cause Value)
SetIeName(kPduSessionReactivationResultErrorCauseIeName);
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
PDU_Session_Reactivation_Result_Error_Cause:: PDU_Session_Reactivation_Result_Error_Cause::
PDU_Session_Reactivation_Result_Error_Cause() { ~PDU_Session_Reactivation_Result_Error_Cause() {}
_iei = 0;
_value = 0;
SESSION_ID = 0;
length = 0;
}
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
PDU_Session_Reactivation_Result_Error_Cause:: void PDU_Session_Reactivation_Result_Error_Cause::setValue(
~PDU_Session_Reactivation_Result_Error_Cause() {} uint8_t session_id, uint8_t cause) {
std::pair<uint8_t, uint8_t> value = std::make_pair(session_id, cause);
pdu_session_id_cause_value_pair.clear();
pdu_session_id_cause_value_pair.push_back(value);
}
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
void PDU_Session_Reactivation_Result_Error_Cause::setValue( void PDU_Session_Reactivation_Result_Error_Cause::setValue(
uint8_t session_id, uint8_t value) { const std::vector<std::pair<uint8_t, uint8_t>>& value) {
SESSION_ID = session_id; if (value.size() > 0) pdu_session_id_cause_value_pair = value;
_value = value; SetLengthIndicator(value.size() * 2);
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
uint8_t PDU_Session_Reactivation_Result_Error_Cause::getValue() { std::pair<uint8_t, uint8_t>
return _value; PDU_Session_Reactivation_Result_Error_Cause::getValue() const {
if (pdu_session_id_cause_value_pair.size() > 0) {
return pdu_session_id_cause_value_pair[0];
}
return std::pair<uint8_t, uint8_t>(0, 0);
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
int PDU_Session_Reactivation_Result_Error_Cause::Encode(uint8_t* buf, int len) { int PDU_Session_Reactivation_Result_Error_Cause::Encode(uint8_t* buf, int len) {
Logger::nas_mm().debug( Logger::nas_mm().debug("Encoding %s", GetIeName().c_str());
"encoding PDU_Session_Reactivation_Result_Error_Cause iei(0x%x)", _iei);
if (len < length) { int ie_len = GetIeLength();
Logger::nas_mm().error("len is less than %d", length);
return 0; if (len < ie_len) { // Length of the content + IEI/Len
Logger::nas_mm().error(
"Size of the buffer is not enough to store this IE (IE len %d)",
ie_len);
return KEncodeDecodeError;
} }
int encoded_size = 0; int encoded_size = 0;
if (_iei) { // IEI and Length (later)
*(buf + encoded_size) = _iei; int len_pos = 0;
encoded_size++; int encoded_header_size =
*(buf + encoded_size) = (length - 3) & 0x00ff; Type6NasIe::Encode(buf + encoded_size, len, len_pos);
encoded_size++; if (encoded_header_size == KEncodeDecodeError) return KEncodeDecodeError;
*(buf + encoded_size) = ((length - 3) & 0xff00) >> 8; encoded_size += encoded_header_size;
encoded_size++;
*(buf + encoded_size) = SESSION_ID; // PDU Session ID/Cause Value
encoded_size++; for (const auto& i : pdu_session_id_cause_value_pair) {
*(buf + encoded_size) = _value; ENCODE_U8(buf + encoded_size, i.first, encoded_size);
encoded_size++; ENCODE_U8(buf + encoded_size, i.second, encoded_size);
} else {
// *(buf + encoded_size) = length - 1; encoded_size++;
// *(buf + encoded_size) = _value; encoded_size++; encoded_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 PDU_Session_Reactivation_Result_Error_Cause len(%d)", "Encoded %s, len (%d)", GetIeName().c_str(), encoded_size);
encoded_size);
return encoded_size; return encoded_size;
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
int PDU_Session_Reactivation_Result_Error_Cause::Decode( int PDU_Session_Reactivation_Result_Error_Cause::Decode(
uint8_t* buf, int len, bool is_option) { uint8_t* buf, int len, bool is_iei) {
Logger::nas_mm().debug( Logger::nas_mm().debug("Decoding EPS_NAS_Message_Container");
"decoding PDU_Session_Reactivation_Result_Error_Cause iei(0x%x)", *buf);
int decoded_size = 0; int decoded_size = 0;
if (is_option) {
decoded_size++; // IEI and Length
uint16_t ie_len = 0;
int decoded_header_size = Type6NasIe::Decode(buf + decoded_size, len, is_iei);
if (decoded_header_size == KEncodeDecodeError) return KEncodeDecodeError;
decoded_size += decoded_header_size;
ie_len = GetLengthIndicator();
// Decode PDU Session ID/Cause Value
pdu_session_id_cause_value_pair.clear();
while (decoded_size < ie_len - 2) {
uint8_t pdu_session_id = {};
uint8_t cause_value = {};
DECODE_U8(buf + decoded_size, pdu_session_id, decoded_size);
DECODE_U8(buf + decoded_size, cause_value, decoded_size);
std::pair<uint8_t, uint8_t> value =
std::make_pair(pdu_session_id, cause_value);
pdu_session_id_cause_value_pair.push_back(value);
} }
_value = 0x00;
length |= *(buf + decoded_size); for (const auto& i : pdu_session_id_cause_value_pair) {
decoded_size++; Logger::nas_mm().debug(
length |= (*(buf + decoded_size)) << 8; "PDU Session ID 0x%x, Cause Value", i.first, i.second);
decoded_size++; }
SESSION_ID = *(buf + decoded_size);
decoded_size++;
_value = *(buf + decoded_size);
decoded_size++;
Logger::nas_mm().debug(
"decoded PDU_Session_Reactivation_Result_Error_Cause value(0x%x)",
_value);
Logger::nas_mm().debug( Logger::nas_mm().debug(
"decoded PDU_Session_Reactivation_Result_Error_Cause len(%d)", "Decoded EPS_NAS_Message_Container (len %d)", decoded_size);
decoded_size);
return decoded_size; return decoded_size;
} }
...@@ -19,37 +19,38 @@ ...@@ -19,37 +19,38 @@
* contact@openairinterface.org * contact@openairinterface.org
*/ */
/*! \file #ifndef _PDU_SESSION_REACTIVATION_RESULT_ERROR_CAUSE_H_
\brief #define _PDU_SESSION_REACTIVATION_RESULT_ERROR_CAUSE_H_
\author Keliang DU, BUPT
\date 2020
\email: contact@openairinterface.org
*/
#ifndef __PDU_Session_Reactivation_Result_Error_Cause_H_
#define __PDU_Session_Reactivation_Result_Error_Cause_H_
#include "Type6NasIe.hpp"
#include <stdint.h> #include <stdint.h>
#include <vector>
constexpr uint8_t kPduSessionReactivationResultErrorCauseMinimumLength = 5;
constexpr uint32_t kPduSessionReactivationResultErrorCauseMaximumLength = 515;
constexpr auto kPduSessionReactivationResultErrorCauseIeName =
"PDU Session Reactivation Result Error Cause";
namespace nas { namespace nas {
class PDU_Session_Reactivation_Result_Error_Cause { class PDU_Session_Reactivation_Result_Error_Cause : Type6NasIe {
public: public:
PDU_Session_Reactivation_Result_Error_Cause(); PDU_Session_Reactivation_Result_Error_Cause();
PDU_Session_Reactivation_Result_Error_Cause(uint8_t iei);
PDU_Session_Reactivation_Result_Error_Cause( PDU_Session_Reactivation_Result_Error_Cause(
const uint8_t iei, uint8_t session_id, uint8_t value); uint8_t session_id, uint8_t value);
~PDU_Session_Reactivation_Result_Error_Cause(); ~PDU_Session_Reactivation_Result_Error_Cause();
void setValue(uint8_t session_id, uint8_t value);
void setValue(uint8_t session_id, uint8_t cause);
std::pair<uint8_t, uint8_t> getValue() const;
void setValue(const std::vector<std::pair<uint8_t, uint8_t>>& value);
void getValue(std::vector<std::pair<uint8_t, uint8_t>>& value) 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_option);
uint8_t getValue();
private: private:
uint8_t _iei; std::vector<std::pair<uint8_t, uint8_t>> pdu_session_id_cause_value_pair;
uint16_t length;
uint8_t SESSION_ID;
uint8_t _value;
}; };
} // namespace nas } // namespace nas
......
...@@ -185,7 +185,7 @@ void RegistrationAccept::setPDU_session_reactivation_result_error_cause( ...@@ -185,7 +185,7 @@ void RegistrationAccept::setPDU_session_reactivation_result_error_cause(
uint8_t session_id, uint8_t value) { uint8_t session_id, uint8_t value) {
ie_pdu_session_reactivation_result_error_cause = ie_pdu_session_reactivation_result_error_cause =
std::make_optional<PDU_Session_Reactivation_Result_Error_Cause>( std::make_optional<PDU_Session_Reactivation_Result_Error_Cause>(
0x72, session_id, value); session_id, 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