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

Update GPRS Timer 3

parent b2d3581a
...@@ -119,6 +119,11 @@ constexpr uint8_t kT3346Value = 0x5f; ...@@ -119,6 +119,11 @@ 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 kIeiGprsTimer3T3324 = 0x6A;
constexpr uint8_t kIeiGprsTimer3T3348 = 0x6B;
constexpr uint8_t kIeiGprsTimer3T3447 = 0x6C;
constexpr uint8_t kIeiGprsTimer3T3512 = 0x5E;
constexpr uint8_t kIeiGprsTimer3BackOffTimer = 0x37;
constexpr uint8_t kIeiEpsNasMessageContainer = 0x70; constexpr uint8_t kIeiEpsNasMessageContainer = 0x70;
constexpr uint8_t kIeiNasMessageContainer = 0x71; constexpr uint8_t kIeiNasMessageContainer = 0x71;
......
...@@ -19,98 +19,94 @@ ...@@ -19,98 +19,94 @@
* contact@openairinterface.org * contact@openairinterface.org
*/ */
/*! \file
\brief
\author Keliang DU, BUPT
\date 2020
\email: contact@openairinterface.org
*/
#include "GPRS_Timer_3.hpp" #include "GPRS_Timer_3.hpp"
#include "logger.hpp"
using namespace nas; using namespace nas;
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
GPRS_Timer_3::GPRS_Timer_3(uint8_t iei) { GPRS_Timer_3::GPRS_Timer_3(uint8_t iei) : Type4NasIe(iei), unit_(), value_() {
_iei = iei; SetLengthIndicator(1);
UNIT = 0; SetIeName(kGprsTimer3IeName);
_value = 0;
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
GPRS_Timer_3::GPRS_Timer_3(const uint8_t iei, uint8_t unit, uint8_t value) { GPRS_Timer_3::GPRS_Timer_3(const uint8_t iei, uint8_t unit, uint8_t value)
_iei = iei; : Type4NasIe(iei) {
UNIT = unit; unit_ = unit;
_value = value; value_ = value;
SetLengthIndicator(1);
SetIeName(kGprsTimer3IeName);
} }
//------------------------------------------------------------------------------
GPRS_Timer_3::GPRS_Timer_3() : _iei(), UNIT(), _value() {}
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
GPRS_Timer_3::~GPRS_Timer_3() {} GPRS_Timer_3::~GPRS_Timer_3() {}
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
void GPRS_Timer_3::setValue(uint8_t unit, uint8_t value) { void GPRS_Timer_3::setValue(uint8_t unit, uint8_t value) {
UNIT = unit; unit_ = unit;
_value = value; value_ = value;
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
uint8_t GPRS_Timer_3::getUnit() { uint8_t GPRS_Timer_3::getUnit() const {
return UNIT; return unit_;
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
uint8_t GPRS_Timer_3::getValue() { uint8_t GPRS_Timer_3::getValue() const {
return _value; return value_;
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
int GPRS_Timer_3::Encode(uint8_t* buf, int len) { int GPRS_Timer_3::Encode(uint8_t* buf, int len) {
Logger::nas_mm().debug("Encoding GPRS_Timer_3 IEI (0x%x)", _iei); Logger::nas_mm().debug("Encoding %s", GetIeName().c_str());
if (len < 3) { int ie_len = GetIeLength();
Logger::nas_mm().error("len is less than 3");
return 0; if (len < ie_len) {
Logger::nas_mm().error("Len is less than %d", ie_len);
return KEncodeDecodeError;
} }
uint8_t octet = 0;
int encoded_size = 0; int encoded_size = 0;
octet = (UNIT << 5) | (_value & 0x1f); // IEI and Length
if (_iei) { int encoded_header_size = Type4NasIe::Encode(buf + encoded_size, len);
*(buf + encoded_size) = _iei; if (encoded_header_size == KEncodeDecodeError) return KEncodeDecodeError;
encoded_size++; encoded_size += encoded_header_size;
*(buf + encoded_size) = 1;
encoded_size++; // Octet 3
*(buf + encoded_size) = octet; uint8_t octet = (unit_ << 5) | (value_ & 0x1f);
encoded_size++; ENCODE_U8(buf + encoded_size, octet, encoded_size);
Logger::nas_mm().debug("Encoded GPRS_Timer_3 content (0x%x)", octet);
} else { Logger::nas_mm().debug(
*(buf + encoded_size) = 1; "Encoded %s, len (%d)", GetIeName().c_str(), encoded_size);
encoded_size++;
*(buf + encoded_size) = octet;
encoded_size++;
}
Logger::nas_mm().debug("Encoded GPRS_Timer_3 len (%d)", encoded_size);
return encoded_size; return encoded_size;
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
int GPRS_Timer_3::Decode(uint8_t* buf, int len, bool is_option) { int GPRS_Timer_3::Decode(uint8_t* buf, int len, bool is_iei) {
Logger::nas_mm().debug("Decoding GPRS_Timer_3 IEI (0x%x)", *buf); if (len < kGprsTimer3Length) {
int decoded_size = 0; Logger::nas_mm().error(
if (is_option) { "Buffer length is less than the minimum length of this IE (%d octet)",
_iei = *buf; kGprsTimer3Length);
decoded_size++; return KEncodeDecodeError;
} }
uint8_t decoded_size = 0;
uint8_t octet = 0; uint8_t octet = 0;
// length = *(buf + decoded_size); Logger::nas_mm().debug("Decoding %s", GetIeName().c_str());
decoded_size++;
octet = *(buf + decoded_size); // IEI and Length
decoded_size++; int decoded_header_size = Type4NasIe::Decode(buf + decoded_size, len, is_iei);
UNIT = (octet & 0xe0) >> 5; if (decoded_header_size == KEncodeDecodeError) return KEncodeDecodeError;
_value = octet & 0x1f; decoded_size += decoded_header_size;
Logger::nas_mm().debug("Decoded GPRS_Timer_3 content (0x%x)", octet);
Logger::nas_mm().debug("Decoded GPRS_Timer_3 len (%d)", decoded_size); DECODE_U8(buf + decoded_size, octet, decoded_size);
unit_ = (octet & 0xe0) >> 5;
value_ = octet & 0x1f;
Logger::nas_mm().debug(
"Decoded %s, Unit 0x%x, Value 0x%x", GetIeName().c_str(), unit_, value_);
Logger::nas_mm().debug(
"Decoded %s, len (%d)", GetIeName().c_str(), decoded_size);
return decoded_size; return decoded_size;
} }
...@@ -19,36 +19,33 @@ ...@@ -19,36 +19,33 @@
* contact@openairinterface.org * contact@openairinterface.org
*/ */
/*! \file #ifndef _GPRS_TIMER_3_H_
\brief #define _GPRS_TIMER_3_H_
\author Keliang DU, BUPT
\date 2020
\email: contact@openairinterface.org
*/
#ifndef __GPRS_Timer_3_H_
#define __GPRS_Timer_3_H_
#include "Type4NasIe.hpp"
#include <stdint.h> #include <stdint.h>
constexpr uint8_t kGprsTimer3Length = 3;
constexpr auto kGprsTimer3IeName = "GPRS Timer 3";
namespace nas { namespace nas {
class GPRS_Timer_3 { class GPRS_Timer_3 : public Type4NasIe {
public: public:
GPRS_Timer_3();
GPRS_Timer_3(uint8_t iei); GPRS_Timer_3(uint8_t iei);
GPRS_Timer_3(const uint8_t iei, uint8_t unit, uint8_t value); GPRS_Timer_3(uint8_t iei, uint8_t unit, uint8_t value);
~GPRS_Timer_3(); ~GPRS_Timer_3();
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);
void setValue(uint8_t unit, uint8_t value); void setValue(uint8_t unit, uint8_t value);
uint8_t getValue(); uint8_t getValue() const;
uint8_t getUnit(); uint8_t getUnit() const;
private: private:
uint8_t _iei; uint8_t unit_;
uint8_t UNIT; uint8_t value_;
uint8_t _value;
}; };
} // namespace nas } // namespace nas
......
...@@ -22,6 +22,11 @@ ...@@ -22,6 +22,11 @@
#ifndef _NAS_IE_H_ #ifndef _NAS_IE_H_
#define _NAS_IE_H_ #define _NAS_IE_H_
#include "3gpp_24.501.hpp"
#include "common_defs.h"
#include "Ie_Const.hpp"
#include "logger.hpp"
#include <optional> #include <optional>
namespace nas { namespace nas {
......
...@@ -219,7 +219,7 @@ int DLNASTransport::Decode(NasMmPlainHeader* header, uint8_t* buf, int len) { ...@@ -219,7 +219,7 @@ int DLNASTransport::Decode(NasMmPlainHeader* header, uint8_t* buf, int len) {
} break; } break;
case 0x37: { case 0x37: {
Logger::nas_mm().debug("Decoding IEI (0x37)"); Logger::nas_mm().debug("Decoding IEI (0x37)");
ie_back_off_timer_value = new GPRS_Timer_3(); ie_back_off_timer_value = new GPRS_Timer_3(kIeiGprsTimer3BackOffTimer);
decoded_size += ie_back_off_timer_value->Decode( decoded_size += ie_back_off_timer_value->Decode(
buf + decoded_size, len - decoded_size, true); buf + decoded_size, len - decoded_size, true);
octet = *(buf + decoded_size); octet = *(buf + decoded_size);
......
...@@ -202,13 +202,14 @@ void RegistrationAccept::setLADN_Information(std::vector<bstring> ladnValue) { ...@@ -202,13 +202,14 @@ void RegistrationAccept::setLADN_Information(std::vector<bstring> ladnValue) {
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
void RegistrationAccept::setNetwork_Slicing_Indication(bool dcni, bool nssci) { void RegistrationAccept::setNetwork_Slicing_Indication(bool dcni, bool nssci) {
ie_network_slicing_indication = ie_network_slicing_indication = std::make_optional<NetworkSlicingIndication>(
std::make_optional<NetworkSlicingIndication>(0x09, dcni, nssci); kIeiNetworkSlicingIndication, dcni, nssci);
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
void RegistrationAccept::setT3512_Value(uint8_t unit, uint8_t value) { void RegistrationAccept::setT3512_Value(uint8_t unit, uint8_t value) {
ie_T3512_value = std::make_optional<GPRS_Timer_3>(0x5E, unit, value); ie_T3512_value =
std::make_optional<GPRS_Timer_3>(kIeiGprsTimer3T3512, unit, value);
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
...@@ -661,8 +662,9 @@ int RegistrationAccept::Decode(uint8_t* buf, int len) { ...@@ -661,8 +662,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 0x9: { case kIeiNetworkSlicingIndication: {
Logger::nas_mm().debug("Decoding IEI (0x9)"); Logger::nas_mm().debug(
"Decoding IEI 0x%x9", kIeiNetworkSlicingIndication);
NetworkSlicingIndication ie_network_slicing_indication_tmp = {}; NetworkSlicingIndication ie_network_slicing_indication_tmp = {};
decoded_size += ie_network_slicing_indication_tmp.Decode( decoded_size += ie_network_slicing_indication_tmp.Decode(
buf + decoded_size, len - decoded_size, true); buf + decoded_size, len - decoded_size, true);
...@@ -788,9 +790,9 @@ int RegistrationAccept::Decode(uint8_t* buf, int len) { ...@@ -788,9 +790,9 @@ int RegistrationAccept::Decode(uint8_t* buf, int len) {
Logger::nas_mm().debug("Next IEI 0x%x", octet); Logger::nas_mm().debug("Next IEI 0x%x", octet);
} break; } break;
*/ */
case 0x5E: { case kIeiGprsTimer3T3512: {
Logger::nas_mm().debug("Decoding IEI (0x5E)"); Logger::nas_mm().debug("Decoding IEI 0x%x", kIeiGprsTimer3T3512);
GPRS_Timer_3 ie_T3512_value_tmp = {}; GPRS_Timer_3 ie_T3512_value_tmp(kIeiGprsTimer3T3512);
decoded_size += ie_T3512_value_tmp.Decode( decoded_size += ie_T3512_value_tmp.Decode(
buf + decoded_size, len - decoded_size, true); buf + decoded_size, len - decoded_size, true);
ie_T3512_value = std::optional<GPRS_Timer_3>(ie_T3512_value_tmp); ie_T3512_value = std::optional<GPRS_Timer_3>(ie_T3512_value_tmp);
...@@ -865,27 +867,27 @@ int RegistrationAccept::Decode(uint8_t* buf, int len) { ...@@ -865,27 +867,27 @@ 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 0x6C: { case kIeiGprsTimer3T3447: {
Logger::nas_mm().debug("Decoding IEI (0x6C)"); Logger::nas_mm().debug("Decoding IEI 0x%x", kIeiGprsTimer3T3447);
GPRS_Timer_3 ie_T3447_value_tmp = {}; GPRS_Timer_3 ie_T3447_value_tmp(kIeiGprsTimer3T3447);
decoded_size += ie_T3447_value_tmp.Decode( decoded_size += ie_T3447_value_tmp.Decode(
buf + decoded_size, len - decoded_size, true); buf + decoded_size, len - decoded_size, true);
ie_T3447_value = std::optional<GPRS_Timer_3>(ie_T3447_value_tmp); ie_T3447_value = std::optional<GPRS_Timer_3>(ie_T3447_value_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 0x6B: { case kIeiGprsTimer3T3348: {
Logger::nas_mm().debug("Decoding IEI (0x6B)"); Logger::nas_mm().debug("Decoding IEI 0x%x", kIeiGprsTimer3T3348);
GPRS_Timer_3 ie_T3448_value_tmp = {}; GPRS_Timer_3 ie_T3448_value_tmp(kIeiGprsTimer3T3348);
decoded_size += ie_T3448_value_tmp.Decode( decoded_size += ie_T3448_value_tmp.Decode(
buf + decoded_size, len - decoded_size, true); buf + decoded_size, len - decoded_size, true);
ie_T3448_value = std::optional<GPRS_Timer_3>(ie_T3448_value_tmp); ie_T3448_value = std::optional<GPRS_Timer_3>(ie_T3448_value_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 0x6A: { case kIeiGprsTimer3T3324: {
Logger::nas_mm().debug("Decoding IEI (0x6A)"); Logger::nas_mm().debug("Decoding IEI 0x%x", kIeiGprsTimer3T3324);
GPRS_Timer_3 ie_T3324_value_tmp = {}; GPRS_Timer_3 ie_T3324_value_tmp(kIeiGprsTimer3T3324);
decoded_size += ie_T3324_value_tmp.Decode( decoded_size += ie_T3324_value_tmp.Decode(
buf + decoded_size, len - decoded_size, true); buf + decoded_size, len - decoded_size, true);
ie_T3324_value = std::optional<GPRS_Timer_3>(ie_T3324_value_tmp); ie_T3324_value = std::optional<GPRS_Timer_3>(ie_T3324_value_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