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